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?

Antworten:


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

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

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]

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


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

Funktioniert, aber wird es als kanonisch-pythonischer Weg angesehen?
Marcel Flygare
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.