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

Respuestas:


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

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

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

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


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

Funciona, pero ¿se considera que es la forma pitónica canónica?
Marcel Flygare
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.