Unisciti a un elenco di stringhe in Python e racchiudi ogni stringa tra virgolette


101

Ho avuto:

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

Voglio avere:

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

Qual è il modo più semplice per farlo con Python?

Risposte:


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

1
@Meow che usa reprche è un po 'hacky in questo caso specifico invece di essere chiaro con le virgolette
jamylak

1
@jamlak ok, repr mi è sembrato più sicuro nel caso in cui ci fossero virgolette nella stringa.
Meow

50

puoi anche eseguire una singola formatchiamata

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

Aggiornamento: alcuni benchmark (eseguiti su un mbp 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

Quindi sembra che in formatrealtà sia piuttosto costoso

Aggiornamento 2: seguendo il commento di @ JCode, aggiungendo un mapper assicurarsi che joinfunzioni, 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

ha una resa migliore di quella proposta da jamylak?
kadrian

3
Questa è una soluzione migliore rispetto alla risposta accettata.
sage88

2
@ sage88 No, non lo è. La preottimizzazione è un male, c'è una probabilità dello 0,0000001% che la minuscola differenza di velocità qui sia l'intero collo di bottiglia di uno script Python. Anche questo codice è molto meno intuitivo quindi non è migliore , è leggermente più veloce . La mia soluzione è più pitonica e leggibile
jamylak

@marchelbling Benchmark non è valido perché la soluzione di jamylak funziona anche per iterabili di non stringhe. Sostituiscilo .join(words)con .join(map(str, words))e mostraci come va.
WloHu

@JCode ha aggiornato il benchmark. Il divario è minore ma c'è ancora un guadagno 2x sulla mia macchina.
marchelbling

39

Puoi provare questo:

str(words)[1:-1]

3
come aggiunge le citazioni?
Dejell

6
Questo aggiunge virgolette singole invece di doppie, ma le virgolette all'interno delle parole verranno automaticamente eliminate. +1 per intelligenza.
Félix Caron,

Questo è uno di quei bocconcini intelligenti che rendono Python così gratificante.
Max von Hippel

Questo è così sorprendente, adoralo, ma probabilmente userò l'altra soluzione solo per rendere il codice un po 'più intuitivo per i miei colleghi sviluppatori.
Yash Sharma


3

Una versione aggiornata della risposta @jamylak con stringhe F (per python 3.6+), ho usato i backtick per una stringa usata per uno script SQL.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'

Funziona, ma è considerato il modo pitonico canonico?
Marcel Flygare
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.