Fügen Sie eine Liste von Zeichenfolgen in Python hinzu und setzen Sie jede Zeichenfolge in Anführungszeichen

101

Ich habe:

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

Ich möchte haben:

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

Was ist der einfachste Weg, dies mit Python zu tun?

Kadrian
quelle

Antworten:

172
>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'
Jamylak
quelle
1
@Meow, das verwendet, reprwas in diesem speziellen Fall ein kleiner Hacky ist, anstatt mit den Zitaten klar zu sein
Jamylak
1
@ Jamlak ok, Repr schien mir nur sicherer, falls Sie Anführungszeichen in Ihrer Zeichenfolge haben.
Miau
50

Sie können auch einen einzelnen formatAnruf ausführen

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

Update: Einige Benchmarking (durchgeführt auf einem 2009 Mbit / s):

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

Es scheint also formatziemlich teuer zu sein

Update 2: Folgen Sie dem Kommentar von @ JCode und fügen Sie ein hinzu, mapum sicherzustellen, dass joinPython 2.7.12 funktioniert

>>> 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
quelle
Hat dies eine bessere Leistung als die von Jamylak vorgeschlagene?
Kadrian
3
Dies ist eine bessere Lösung als die akzeptierte Antwort.
sage88
2
@ sage88 Nein, ist es nicht. Voroptimierung ist böse, es besteht eine Wahrscheinlichkeit von 0,0000001%, dass der winzige Geschwindigkeitsunterschied hier den gesamten Engpass eines Python-Skripts darstellt. Auch dieser Code ist viel weniger intuitiv, so dass er nicht besser ist , sondern etwas schneller . Meine Lösung ist pythonischer und lesbarer
Jamylak
@marchelbling Benchmark ist ungültig, da die Lösung von jamylak auch für Iterables von Nicht-Strings funktioniert. Ersetzen Sie .join(words)durch .join(map(str, words))und zeigen Sie uns, wie das geht.
WloHu
@JCode hat den Benchmark aktualisiert. Die Lücke ist kleiner, aber es gibt immer noch einen 2-fachen Gewinn auf meiner Maschine.
Marchelbling
39

Sie können dies versuchen:

str(words)[1:-1]
Thykof
quelle
3
Wie werden Anführungszeichen hinzugefügt?
Dejell
6
Dadurch werden einfache Anführungszeichen anstelle von doppelten Anführungszeichen hinzugefügt, Anführungszeichen in den Wörtern werden jedoch automatisch maskiert. +1 für Klugheit.
Félix Caron
Dies ist einer dieser cleveren Leckerbissen, die Python so lohnend machen.
Max von Hippel
Das ist so erstaunlich, ich liebe es einfach, aber ich werde wahrscheinlich die andere Lösung verwenden, um den Code für meine Entwicklerkollegen ein wenig intuitiver zu gestalten.
Yash Sharma
7
>>> ', '.join(['"%s"' % w for w in words])
Emmett Butler
quelle
Das Format ist seit Python 2.6 verfügbar.
Khertan
3

In einer aktualisierten Version der @ jamylak-Antwort mit F-Zeichenfolgen (für Python 3.6+) habe ich Backticks für eine Zeichenfolge verwendet, die für ein SQL-Skript verwendet wird.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'
Gruber
quelle
Funktioniert, aber wird es als kanonisch-pythonischer Weg angesehen?
Marcel Flygare