Únase a una lista de cadenas en python y envuelva cada cadena entre comillas

101

Tengo:

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

Quiero tener:

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

¿Cuál es la forma más sencilla de hacer esto con Python?

kadrian
fuente

Respuestas:

173
>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'
Jamylak
fuente
1
@Meow que usa reprcuál es un pequeño hacky en este caso específico en lugar de ser claro con las citas
jamylak
1
@jamlak ok, repr me pareció más seguro en caso de que tengas comillas en tu cadena.
Miau
50

también puede realizar una sola formatllamada

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

Actualización: algunas evaluaciones comparativas (realizadas en un 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

Entonces parece que en formatrealidad es bastante caro

Actualización 2: siguiendo el comentario de @ JCode, agregando un mappara asegurarse de 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
marchelbling
fuente
¿Tiene esto un rendimiento mejor que el propuesto por Jamylak?
kadrian
3
Esta es una mejor solución que la respuesta aceptada.
sage88
2
@ sage88 No, no lo es. La preoptimización es mala, hay un 0,0000001% de probabilidad de que la minúscula diferencia de velocidad aquí sea el cuello de botella completo de un script de Python. Además, este código es mucho menos intuitivo, por lo que no es mejor , es un poco más rápido . Mi solución es más pitónica y legible
jamylak
@marchelbling Benchmark no es válido porque la solución de jamylak funciona también para iterables de no cadenas. Reemplaza .join(words)con .join(map(str, words))y muéstranos cómo va.
WloHu
@JCode actualizó el punto de referencia. La brecha es menor pero todavía hay una ganancia de 2x en mi máquina.
Marchelbling
39

Puedes probar esto:

str(words)[1:-1]
Thykof
fuente
3
¿cómo agrega comillas?
Dejell
6
Esto agrega comillas simples en lugar de dobles, pero las comillas dentro de las palabras se escaparán automáticamente. +1 por inteligencia.
Félix Caron
Este es uno de esos datos ingeniosos que hacen que Python sea tan gratificante.
Max von Hippel
Esto es tan asombroso, me encanta, pero probablemente usaré la otra solución solo para hacer que el código sea un poco más intuitivo para mis compañeros desarrolladores.
Yash Sharma
7
>>> ', '.join(['"%s"' % w for w in words])
Mayordomo de emmett
fuente
El formato está disponible desde python 2.6.
Khertan
3

Una versión actualizada de @jamylak responde con F Strings (para python 3.6+), he usado comillas invertidas para una cadena utilizada para un script SQL.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'
Gruber
fuente
Funciona, pero ¿se considera que es la forma pitónica canónica?
Marcel Flygare