Rejoignez une liste de chaînes en python et mettez chaque chaîne entre guillemets

101

J'ai:

words = ['hello', 'world', 'you', 'look', 'nice']

Je veux avoir:

'"hello", "world", "you", "look", "nice"'

Quelle est la façon la plus simple de faire cela avec Python?

Kadrian
la source

Réponses:

173
>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'
Jamylak
la source
1
@Meow qui utilise reprce qui est un petit hacky dans ce cas spécifique au lieu d'être clair avec les guillemets
jamylak
1
@jamlak ok, repr me semblait juste plus sûr au cas où vous auriez des guillemets dans votre chaîne.
Meow
50

vous pouvez également effectuer un seul formatappel

>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> '"{0}"'.format('", "'.join(words))
'"hello", "world", "you", "look", "nice"'

Mise à jour: Quelques benchmarking (effectué sur un mbp 2009):

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.32559704780578613

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; '"{}"'.format('", "'.join(words))""").timeit(1000)
0.018904924392700195

Il semble donc que formatc'est en fait assez cher

Mise à jour 2: suite au commentaire de @ JCode, ajout d'un mappour s'assurer que joincela fonctionnera, Python 2.7.12

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.08646488189697266

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; '"{}"'.format('", "'.join(map(str, words)))""").timeit(1000)
0.04855608940124512

>>> timeit.Timer("""words = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.17348504066467285

>>> timeit.Timer("""words = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 100; '"{}"'.format('", "'.join(map(str, words)))""").timeit(1000)
0.06372308731079102
Marchelbling
la source
a-t-il une meilleure performance que celle proposée par jamylak?
kadrian
3
C'est une meilleure solution que la réponse acceptée.
sage88
2
@ sage88 Non, ce n'est pas le cas. La préoptimisation est mauvaise, il y a 0,0000001% de chances que la différence de vitesse minuscule ici soit le goulot d'étranglement complet d'un script Python. De plus, ce code est beaucoup moins intuitif donc ce n'est pas mieux , il est très légèrement plus rapide . Ma solution est plus pythonique et lisible
jamylak
@marchelbling Benchmark n'est pas valide car la solution de jamylak fonctionne également pour les itérables de non-chaînes. Remplacez .join(words)par .join(map(str, words))et montrez-nous comment cela se passe.
WloHu
@JCode a mis à jour le benchmark. L'écart est plus petit mais il y a toujours un gain de 2x sur ma machine.
marchelbling
39

Vous pouvez essayer ceci:

str(words)[1:-1]
Thykof
la source
3
comment ajoute-t-il des citations?
Dejell
6
Cela ajoute des guillemets simples au lieu de doubles, mais les guillemets à l'intérieur des mots seront automatiquement échappés. +1 pour l'intelligence.
Félix Caron
C'est l'une de ces astuces intelligentes qui rend Python si gratifiant.
Max von Hippel
C'est tellement incroyable, j'adore ça, mais j'utiliserai probablement l'autre solution juste pour rendre le code un peu plus intuitif pour mes collègues développeurs.
Yash Sharma
7
>>> ', '.join(['"%s"' % w for w in words])
Emmett Butler
la source
Le format est disponible depuis python 2.6.
Khertan
3

Une version mise à jour de la réponse @jamylak avec des chaînes F (pour python 3.6+), j'ai utilisé des backticks pour une chaîne utilisée pour un script SQL.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'
Gruber
la source
Fonctionne, mais est-ce considéré comme la voie pythonique canonique?
Marcel Flygare