เข้าร่วมรายการสตริงใน python และรวมแต่ละสตริงด้วยเครื่องหมายคำพูด


107

ฉันมี:

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

ฉันต้องการมี:

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

วิธีที่ง่ายที่สุดในการทำ Python คืออะไร?

คำตอบ:


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

1
@Meow ที่ใช้reprซึ่งเป็น lil hacky ในกรณีเฉพาะนี้แทนที่จะชัดเจนกับคำพูด
jamylak

1
@jamlak ตกลง repr ดูเหมือนจะปลอดภัยกว่าสำหรับฉันในกรณีที่คุณมีคำพูดในสตริงของคุณ
Meow

51

คุณสามารถformatโทรเพียงครั้งเดียว

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

อัปเดต: การเปรียบเทียบบางส่วน (ดำเนินการในปี 2552 mbp):

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

ดูเหมือนว่าformatจะมีราคาค่อนข้างแพง

อัปเดต 2: ทำตามความคิดเห็นของ @ JCode เพิ่ม a mapเพื่อให้แน่ใจว่า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 เสนอหรือไม่?
kadrian

3
นี่เป็นทางออกที่ดีกว่าคำตอบที่ยอมรับ
sage88

2
@ sage88 ไม่มันไม่ใช่ Preoptimization เป็นสิ่งที่ชั่วร้ายมีโอกาส 0.0000001% ที่ความแตกต่างของความเร็วขั้นต่ำที่นี่คือคอขวดทั้งหมดของสคริปต์ Python นอกจากนี้รหัสนี้มีมากน้อยที่ใช้งานง่ายจึงไม่ดีขึ้นก็เป็นมากเร็วขึ้นเล็กน้อย ทางออกของฉันคือ pythonic และอ่านได้มากกว่า
jamylak

@marchelbling Benchmark ไม่ถูกต้องเนื่องจากโซลูชันของ jamylak ใช้งานได้กับการวนซ้ำของสตริงที่ไม่ใช่สตริง แทนที่.join(words)ด้วย.join(map(str, words))และแสดงให้เราเห็นว่าเป็นอย่างไร
WloHu

@JCode อัปเดตเกณฑ์มาตรฐาน ช่องว่างเล็กลง แต่ยังมีการเพิ่มขึ้น 2 เท่าในเครื่องของฉัน
marchelbling

41

คุณสามารถลองสิ่งนี้:

str(words)[1:-1]

3
มันเพิ่มคำพูดได้อย่างไร?
Dejell

6
สิ่งนี้จะเพิ่มเครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นคู่ แต่เครื่องหมายคำพูดภายในคำนั้นจะถูกหลีกเลี่ยงโดยอัตโนมัติ +1 เพื่อความฉลาด
Félix Caron

นี่เป็นหนึ่งในเกร็ดความรู้อันชาญฉลาดที่ทำให้ Python ได้รับรางวัลมาก
Max von Hippel

มันน่าทึ่งมากแค่รักมัน แต่ฉันอาจจะใช้วิธีอื่นเพื่อทำให้โค้ดใช้งานง่ายขึ้นสำหรับนักพัฒนาเพื่อนของฉัน
Yash Sharma


4

คำตอบ @jamylak เวอร์ชันอัปเดตพร้อม F Strings (สำหรับ python 3.6+) ฉันใช้ backticks สำหรับสตริงที่ใช้สำหรับสคริปต์ SQL

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

ใช้งานได้ แต่ถือว่าเป็นวิธี pythonic ที่ยอมรับได้หรือไม่?
Marcel Flygare
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.