Приєднайтеся до списку рядків у python і оберніть кожен рядок у лапки


101

У мене є:

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

Я хочу мати:

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

Який найпростіший спосіб зробити це за допомогою Python?

Відповіді:


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

1
@Meow, що reprв цьому конкретному випадку використовує щось дуже хакі, на відміну від того, щоб бути зрозумілим із цитатами
jamylak

1
@jamlak гаразд, репр мені просто здався безпечнішим, якщо у твоєму рядку є лапки.
Мяу

50

Ви також можете здійснити один formatдзвінок

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

Оновлення: Деякі бенчмаркінги (виконані на 2009 mbp):

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

Тож здається, що formatнасправді це досить дорого

Оновлення 2: слідуючи за коментарем @ JCode, додавши, mapщоб переконатися, що це joinбуде працювати, 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

чи це має кращі показники, ніж той, який запропонував jamylak?
kadrian

3
Це краще рішення, ніж прийнята відповідь.
sage88

2
@ sage88 Ні, це не так. Предоптимізація - це зло, існує 0,0000001% ймовірності, що незначна різниця швидкості тут є цілим вузьким місцем сценарію Python. Крім того, цей код набагато менш інтуїтивний, тому він не кращий , він дуже трохи швидший . Моє рішення є більш пітонічним і читабельним
jamylak

Тест @marchelbling Benchmark недійсний, оскільки рішення jamylak 'працює також для ітерацій нестрункових. Замінити .join(words)з .join(map(str, words))і показати нам , як це йде.
WloHu

@JCode оновив еталон. Розрив менший, але на моїй машині все ще є два рази виграшу.
маршелінг

39

Ви можете спробувати це:

str(words)[1:-1]

3
як він додає лапки?
Dejell

6
Це додає одинарні лапки замість подвійних, але лапки всередині слів будуть автоматично екрановані. +1 для кмітливості.
Фелікс Карон,

Це одна з тих хитромудрих штучок, яка робить Python такою корисною.
Макс фон Гіппель,

Це настільки дивно, просто люблю, але я, мабуть, буду використовувати інше рішення просто для того, щоб зробити код трохи інтуїтивнішим для моїх колег розробників.
Яш Шарма


3

Оновлена ​​версія відповіді @jamylak із F Strings (для python 3.6+), я використовував зворотні позначки для рядка, який використовується для сценарію SQL.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'

Працює, але чи вважається це канонічним пітонічним способом?
Марсель Флайгаре
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.