Python'da dizelerin bir listesine katılın ve her dizeyi tırnak işaretleri içine alın


107

Sahibim:

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

Ben sahip olmak istiyorum:

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

Bunu Python ile yapmanın en kolay yolu nedir?

Yanıtlar:


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

1
@Meow, reprbu özel durumda alıntılarla net olmak yerine bir lil hacky olanı kullanıyor
jamylak

1
@jamlak tamam, dizinde alıntılar varsa repr bana daha güvenli görünüyordu.
Miyav

51

ayrıca tek bir formatarama da yapabilirsiniz

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

Güncelleme: Bazı kıyaslamalar (2009 mbp'de yapıldı):

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

Görünüşe göre formatbu aslında oldukça pahalı

Güncelleme 2: @ JCode'un yorumunu takiben , çalışacağından mapemin olmak için bir ekleme 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

Jamylak'ın önerdiğinden daha iyi bir performansa sahip mi?
kadrian

3
Bu, kabul edilen cevaptan daha iyi bir çözümdür.
sage88

2
@ sage88 Hayır değil. Preoptimization kötüdür, buradaki minimum hız farkının bir Python betiğinin tüm darboğazı olması için% 0,0000001 şansı vardır. Ayrıca bu kod çok daha az sezgiseldir, bu yüzden daha iyi değildir , çok az daha hızlıdır . Benim çözümüm daha
pitonik

@marchelbling Benchmark geçersiz çünkü jamylak'ın çözümü dizge olmayanların yinelenenleri için de çalışıyor. Değiştir .join(words)ile .join(map(str, words))ve bu nasıl gider bize göstermek.
WloHu

@JCode karşılaştırmayı güncelledi. Boşluk daha küçük ama makinemde hala 2x kazanç var.
marchelbling

41

Bunu deneyebilirsiniz:

str(words)[1:-1]

3
alıntıları nasıl ekler?
Dejell

6
Bu, çift yerine tek tırnak işaretleri ekler, ancak sözcüklerin içindeki tırnak işaretleri otomatik olarak önlenecektir. Akıllılık için +1.
Félix Caron

Bu, Python'u bu kadar ödüllendirici kılan o akıllıca haberlerden biridir.
Max von Hippel

Bu çok şaşırtıcı, bayıldım, ama muhtemelen diğer çözümü sadece kodu diğer geliştiricilerim için biraz daha sezgisel hale getirmek için kullanacağım.
Yash Sharma


4

F Strings (python 3.6+ için) ile @jamylak yanıtının güncellenmiş bir sürümü, SQL komut dosyası için kullanılan bir dize için ters işaretler kullandım.

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

Çalışıyor, ancak kanonik pitonik yol olarak kabul ediliyor mu?
Marcel Flygare
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.