Junte uma lista de strings em python e coloque cada string entre aspas

101

Eu tenho:

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

Eu quero ter:

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

Qual é a maneira mais fácil de fazer isso com Python?

Kadrian
fonte

Respostas:

173
>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'
Jamylak
fonte
1
@Meow que usa o reprque é um pouco hackeado neste caso específico, em vez de ser claro com as aspas
jamylak
1
@jamlak ok, repr simplesmente parecia mais seguro para mim caso você tenha aspas em sua string.
Meow
50

você também pode realizar uma única formatchamada

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

Atualização: Alguns benchmarking (realizado em um MBP de 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

Parece que formaté muito caro

Atualização 2: seguindo o comentário de @JCode, adicionando um mappara garantir que joinfuncionará, 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
marchando
fonte
este tem um desempenho melhor do que o proposto por jamylak?
kadrian de
3
Esta é uma solução melhor do que a resposta aceita.
sage88 de
2
@ sage88 Não, não é. A pré-otimização é ruim, há 0,0000001% de chance de que a diferença de velocidade minúscula aqui seja todo o gargalo de um script Python. Além disso, este código é muito menos intuitivo, por isso não é melhor , é um pouco mais rápido . Minha solução é mais pitônica e legível
Jamylak de
@marchelbling Benchmark é inválido porque a solução de jamylak funciona também para iteráveis ​​de não strings. Substitua .join(words)por .join(map(str, words))e nos mostre como funciona.
WloHu
@JCode atualizou o benchmark. A diferença é menor, mas ainda há um ganho de 2x na minha máquina.
marcha de
39

Você pode tentar isto:

str(words)[1:-1]
Thykof
fonte
3
como isso adiciona aspas?
Dejell
6
Isso adiciona aspas simples em vez de duplas, mas as aspas dentro das palavras serão automaticamente evitadas. +1 para inteligência.
Félix Caron de
Este é um daqueles petiscos inteligentes que tornam o Python tão gratificante.
Max von Hippel de
Isso é tão incrível, simplesmente adoro, mas provavelmente usarei a outra solução apenas para tornar o código um pouco mais intuitivo para meus colegas desenvolvedores.
Yash Sharma,
7
>>> ', '.join(['"%s"' % w for w in words])
Emmett Butler
fonte
O formato está disponível desde o python 2.6.
Khertan
3

Uma versão atualizada do @jamylak responde com F Strings (para python 3.6+), usei crases para uma string usada para um script SQL.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'
Gruber
fonte
Funciona, mas é considerada a forma pítônica canônica?
Marcel Flygare