Bergabunglah dengan daftar string dengan python dan bungkus setiap string dengan tanda kutip

104

Aku mendapat:

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

Saya ingin memiliki:

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

Apa cara termudah untuk melakukan ini dengan Python?

kadrian
sumber

Jawaban:

176
>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'
jamylak
sumber
1
@Meow yang menggunakan repryang sedikit hacky dalam kasus khusus ini sebagai lawan menjelaskan dengan kutipan
jamylak
1
@jamlak ok, repr sepertinya lebih aman bagi saya jika Anda memiliki kutipan dalam string Anda.
Meong
51

Anda juga dapat melakukan satu formatpanggilan

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

Pembaruan: Beberapa pembandingan (dilakukan pada 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

Jadi sepertinya itu formatcukup mahal

Pembaruan 2: mengikuti komentar @ JCode, menambahkan a mapuntuk memastikan itu joinakan berfungsi, 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
sumber
apakah ini memiliki kinerja yang lebih baik daripada yang diusulkan oleh jamylak?
kadrian
3
Ini adalah solusi yang lebih baik daripada jawaban yang diterima.
sage88
2
@ sage88 Tidak. Pra-pengoptimalan itu buruk, ada kemungkinan 0,0000001% bahwa perbedaan kecepatan yang sangat kecil di sini adalah penyebab utama dari skrip Python. Kode ini juga kurang intuitif sehingga tidak lebih baik , sangat sedikit lebih cepat . Solusi saya lebih pythonic dan dapat dibaca
jamylak
@marchelbling Benchmark tidak valid karena solusi jamylak 'juga berfungsi untuk iterable non-string. Ganti .join(words)dengan .join(map(str, words))dan tunjukkan kami bagaimana kelanjutannya.
WloHu
@JCode memperbarui patokan. Celahnya lebih kecil tetapi masih ada keuntungan 2x di mesin saya.
marchelbling
40

Anda bisa mencoba ini:

str(words)[1:-1]
Thykof
sumber
3
bagaimana cara menambahkan tanda kutip?
Dejell
6
Ini menambahkan tanda kutip tunggal, bukan ganda, tetapi tanda kutip di dalam kata akan secara otomatis di-escape. 1 untuk kepintaran.
Félix Caron
Ini adalah salah satu informasi cerdas yang membuat Python sangat bermanfaat.
Max von Hippel
Ini sangat luar biasa, suka saja, tetapi saya mungkin akan menggunakan solusi lain hanya untuk membuat kode sedikit lebih intuitif untuk sesama pengembang.
Yash Sharma
7
>>> ', '.join(['"%s"' % w for w in words])
Emmett Butler
sumber
Format tersedia sejak python 2.6.
Khertan
4

Versi terbaru dari jawaban @jamylak dengan F Strings (untuk python 3.6+), saya telah menggunakan backticks untuk string yang digunakan untuk skrip SQL.

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'
Gruber
sumber
Bekerja, tetapi apakah itu dianggap sebagai cara pythonic kanonik?
Marcel Flygare