Dołącz do listy ciągów w Pythonie i zawiń każdy ciąg w cudzysłów

104

Mam:

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

Chcę mieć:

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

Jaki jest najłatwiejszy sposób na zrobienie tego w Pythonie?

kadrian
źródło

Odpowiedzi:

176
>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'
jamylak
źródło
1
@Meow, który używa tego, reprco jest lil hacky w tym konkretnym przypadku, w przeciwieństwie do jasnego cytowania
jamylak
1
@jamlak ok, repr po prostu wydawało mi się bezpieczniejsze, gdybyś miał cudzysłowy w swoim ciągu.
Meow
51

możesz również wykonać pojedyncze formatpołączenie

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

Aktualizacja: Niektóre testy porównawcze (przeprowadzone na poziomie 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

Wygląda więc na to, że formatjest to dość drogie

Aktualizacja 2: po komentarzu @ JCode, dodając, mapaby upewnić się, że joinzadziała, 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
źródło
czy to ma lepszą wydajność niż ta proponowana przez jamylaka?
kadrian
3
To lepsze rozwiązanie niż przyjęta odpowiedź.
sage88
2
@ sage88 Nie, nie jest. Preoptymalizacja jest zła, istnieje 0,0000001% szans, że niewielka różnica w szybkości jest tutaj całym wąskim gardłem skryptu Pythona. Również ten kod jest znacznie mniej intuicyjny, więc nie jest lepszy , jest bardzo nieznacznie szybszy . Moje rozwiązanie jest bardziej pytoniczne i czytelne
jamylak
@marchelbling Benchmark jest nieprawidłowy, ponieważ rozwiązanie jamylaka działa również dla iterowalnych elementów niebędących ciągami. Wymień .join(words)się .join(map(str, words))i pokaż nam, jak to idzie.
WloHu,
@JCode zaktualizował test porównawczy. Różnica jest mniejsza, ale na mojej maszynie nadal jest 2x zysk.
marchelbling
40

Możesz spróbować tego:

str(words)[1:-1]
Thykof
źródło
3
jak dodaje cytaty?
Dejell
6
Spowoduje to dodanie pojedynczych cudzysłowów zamiast podwójnych, ale cudzysłowy w słowach zostaną automatycznie zmienione. +1 za spryt.
Félix Caron
To jedna z tych sprytnych ciekawostek, dzięki którym Python jest tak satysfakcjonujący.
Max von Hippel,
To niesamowite, po prostu to uwielbiam, ale prawdopodobnie użyję innego rozwiązania tylko po to, aby uczynić kod nieco bardziej intuicyjnym dla innych programistów.
Yash Sharma,
7
>>> ', '.join(['"%s"' % w for w in words])
Emmett Butler
źródło
Format jest dostępny od wersji Pythona 2.6.
Khertan
4

Zaktualizowana wersja odpowiedzi @jamylak z ciągami F (dla Pythona 3.6+), użyłem znaków odwrotnych do znaków używanych w skrypcie SQL.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'
Gruber
źródło
Działa, ale czy uważa się, że jest to kanoniczna droga pytoniczna?
Marcel Flygare