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.