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?

Odpowiedzi:


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

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

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]

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,


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

Działa, ale czy uważa się, że jest to kanoniczna droga pytoniczna?
Marcel Flygare
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.