Приєднайтеся до списку рядків у 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.