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?

Jawaban:


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

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

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]

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


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

Bekerja, tetapi apakah itu dianggap sebagai cara pythonic kanonik?
— Marcel Flygare
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.