Присоединяйтесь к списку строк в Python и заключите каждую строку в кавычки

104

У меня есть:

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

Я хочу иметь:

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

Какой самый простой способ сделать это с помощью Python?

Кадриан
источник

Ответы:

176
>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'
Джамылак
источник
1
@Meow that uses that repris lil hacky в данном конкретном случае, в отличие от ясности с цитатами
jamylak
1
@jamlak хорошо, repr мне показалось более безопасным, если в вашей строке есть кавычки.
Мяу
51

вы также можете выполнить одиночный 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
маршельблинг
источник
у этого есть лучшая производительность, чем у Джамылака?
Кадриан
3
Это лучшее решение, чем принятый ответ.
sage88
2
@ sage88 Нет, это не так. Предварительная оптимизация - это зло, существует вероятность 0,0000001%, что незначительная разница в скорости здесь является узким местом скрипта Python. Кроме того, этот код гораздо менее интуитивно понятен, поэтому он не лучше , он немного быстрее . Мое решение более питоническое и читабельное
jamylak
Тест @marchelbling недействителен, потому что решение jamylak работает также для итераций нестроковых элементов. Замените .join(words)на .join(map(str, words))и покажите нам, как это происходит.
WloHu
@JCode обновил тест. Разрыв меньше, но на моей машине все равно вдвое больше.
Marchelbling
40

Вы можете попробовать это:

str(words)[1:-1]
Thykof
источник
3
как добавить кавычки?
Dejell
6
Это добавляет одинарные кавычки вместо двойных, но кавычки внутри слов будут автоматически экранированы. +1 за сообразительность.
Félix Caron
Это один из тех умных моментов, которые делают Python таким полезным.
Макс фон Хиппель
Это так потрясающе, мне просто нравится, но я, вероятно, воспользуюсь другим решением, просто чтобы сделать код более интуитивно понятным для моих коллег-разработчиков.
Яш Шарма
7
>>> ', '.join(['"%s"' % w for w in words])
Эммет Батлер
источник
Формат доступен начиная с python 2.6.
Хертан
4

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

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'
Грубер
источник
Работает, но считается ли это каноническим питоническим способом?
Марсель Флайгар,