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.