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?

Réponses:


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

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

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]

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


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`'

Fonctionne, mais est-ce considéré comme la voie pythonique canonique?
Marcel Flygare
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.