Nối danh sách các chuỗi trong python và đặt mỗi chuỗi trong dấu ngoặc kép


101

Tôi có:

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

Tôi muốn có:

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

Cách dễ nhất để làm điều này với Python là gì?

Câu trả lời:


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

1
@Meow rằng sử dụng reprmà là một hacky lil trong trường hợp cụ thể này chứ không phải là rõ ràng với các dấu ngoặc kép
jamylak

1
@jamlak ok, repr có vẻ an toàn hơn với tôi trong trường hợp bạn có dấu ngoặc kép trong chuỗi của mình.
Meo meo

50

bạn cũng có thể thực hiện một formatcuộc gọi

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

Cập nhật: Một số điểm chuẩn (được thực hiện trên 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

Vì vậy, có vẻ như nó formatthực sự khá đắt

Cập nhật 2: sau nhận xét của @ JCode, thêm a mapđể đảm bảo điều đó joinsẽ hoạt động, 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

cái này có hiệu suất tốt hơn cái do jamylak đề xuất không?
kadrian

3
Đây là một giải pháp tốt hơn câu trả lời được chấp nhận.
sage88

2
@ sage88 Không, không phải vậy. Tiền tối ưu hóa là điều xấu, có 0,0000001% khả năng sự khác biệt về tốc độ rất nhỏ ở đây là toàn bộ nút thắt cổ chai của tập lệnh Python. Ngoài ra mã này kém trực quan hơn nhiều nên không tốt hơn , nó nhanh hơn một chút . Giải pháp của tôi là pythonic hơn và dễ đọc
jamylak

@marchelbling Benchmark không hợp lệ vì giải pháp của jamylak cũng hoạt động đối với các tệp lặp không phải chuỗi. Thay thế .join(words)bằng .join(map(str, words))và cho chúng tôi thấy nó diễn ra như thế nào.
WloHu

@JCode đã cập nhật điểm chuẩn. Khoảng cách nhỏ hơn nhưng vẫn có mức tăng gấp 2 lần trên máy của tôi.
marchelbling

39

Bạn có thể thử điều này:

str(words)[1:-1]

3
làm thế nào để nó thêm dấu ngoặc kép?
Dejell

6
Điều này thêm dấu ngoặc kép đơn thay vì dấu ngoặc kép, nhưng dấu ngoặc kép bên trong các từ sẽ tự động thoát ra. +1 cho sự thông minh.
Félix Caron

Đây là một trong những mẩu tin thông minh khiến Python trở nên bổ ích.
Max von Hippel

Điều này thật tuyệt vời, chỉ cần thích nó, nhưng tôi có thể sẽ sử dụng giải pháp khác chỉ để làm cho mã trực quan hơn một chút cho các nhà phát triển đồng nghiệp của tôi.
Yash Sharma


3

Một phiên bản cập nhật của câu trả lời @jamylak với F Strings (cho python 3.6+), tôi đã sử dụng dấu gạch ngược cho một chuỗi được sử dụng cho tập lệnh SQL.

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

Hoạt động, nhưng nó có được coi là một cách pythonic kinh điển?
Marcel Flygare
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.