Chuyển đổi danh sách các ký tự thành một chuỗi


Câu trả lời:


585

Sử dụng joinphương thức của chuỗi trống để nối tất cả các chuỗi với chuỗi trống ở giữa, như vậy:

>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'

1
Làm thế nào tôi có thể thêm khoảng trắng giữa các nhân vật? Dù sao để làm điều đó mà không lặp đi lặp lại toàn bộ?
clifgray

18
chỉ cần làm ' '.join(list)với một khoảng trống giữa các trích dẫn
clifgray

Một điều tuyệt vời ở đây là bạn có thể sử dụng '\ n'.join (a) nếu bạn muốn viết một danh sách cho một txt với các dòng mới cho mỗi mục
Norfeldt

28
Để làm rõ: "".join(['a','b','c'])phương tiện Join all elements of the array, separated by the string "". Theo cách tương tự, " hi ".join(["jim", "bob", "joe"])sẽ tạo ra "jim hi bob hi joe".
Jack

39

Điều này hoạt động trong nhiều ngôn ngữ phổ biến như JavaScript và Ruby, tại sao không phải bằng Python?

>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'

Thật kỳ lạ, trong Python joinphương thức nằm trên strlớp:

# this is the Python way
"".join(['a','b','c','d'])

Tại sao joinkhông phải là một phương thức trong listđối tượng như trong JavaScript hoặc các ngôn ngữ tập lệnh phổ biến khác? Đây là một ví dụ về cách cộng đồng Python nghĩ. Vì phép nối đang trả về một chuỗi, nên nó được đặt trong lớp chuỗi, không phải trên lớp danh sách, vì vậy str.join(list)phương thức có nghĩa là: nối danh sách vào một chuỗi mới bằng cách sử dụng strnhư một dấu phân cách (trong trường hợp strnày là một chuỗi rỗng).

Bằng cách nào đó tôi đã yêu cách suy nghĩ này sau một thời gian. Tôi có thể phàn nàn về rất nhiều thứ trong thiết kế Python, nhưng không phải về sự gắn kết của nó.


1
Lý do chính để tham gia là một phương thức chuỗi chứ không phải là một phương thức danh sách là vì nó chấp nhận bất kỳ lần lặp nào , không chỉ là một danh sách. Bạn có thể sử dụng biểu thức trình tạo, từ điển, bộ, dạng xem khác nhau, v.v. Vì vậy, nó linh hoạt hơn nhiều so với hoạt động nối mảng trong hầu hết các ngôn ngữ.
rosuav

Tôi đã so sánh Python string.join()với hầu hết các bộ sưu tập có một join()phương thức trong nhiều ngôn ngữ động. Về iterables, tôi đoán nó không phải là vấn đề đối với các ngôn ngữ như vậy bởi vì nó dễ dàng (và dễ đọc) để bao gồm iterable trong một hàm tạo và chuỗi trong bộ sưu tập trong join()phương thức.
Paulo Scardine 17/8/2016

Vâng, giả sử họ có danh sách lười biếng (kiểu Haskell) hoặc bạn cảm thấy thoải mái với việc kết hợp danh sách vào bộ nhớ trước khi bắt đầu. Quan điểm của tôi là cách làm của Python không độc đoán, nó có lý do rất tốt.
rosuav

1
Nó không phải là tùy ý, nó là một quyết định thiết kế để tránh ô nhiễm không gian tên trong mỗi lớp. :-)
Paulo Scardine

Chính xác. Thêm vào đó, không phải tất cả chúng đều là các lớp - "iterable" là một giao thức, không phải là một lớp. Bạn có thể lọc, ánh xạ, tham gia, v.v., bằng cách sử dụng bất kỳ lần lặp nào.
rosuav

15

Nếu trình thông dịch Python của bạn đã cũ (ví dụ 1.5.2, phổ biến trên một số bản phân phối Linux cũ hơn), bạn có thể không có join()sẵn như một phương thức trên bất kỳ đối tượng chuỗi cũ nào và thay vào đó bạn sẽ cần sử dụng mô-đun chuỗi. Thí dụ:

a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

except AttributeError:
    import string
    b = string.join(a, '')

Chuỗi bsẽ là 'abcd'.


10

Đây có thể là cách nhanh nhất:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'

4
@WinstonEwert vâng, hôm qua tôi đã viết một chương trình cần phải làm điều đó và tôi đã điểm chuẩn một vài cách để hiệu suất của dòng này được tính trong chương trình của tôi, kết quả cho thấy nó nhanh hơn khoảng 20% ​​sau đó''.join(['a','b','c'])
bigeagle

2
Điểm chuẩn của riêng tôi cho thấy tham gia nhanh hơn 7 lần. pastebin.com/8nSc5Ek1 . Bạn nhớ chia sẻ điểm chuẩn của bạn?
Winston Ewert

1
@WinstonEwert Bạn nói đúng. Tôi đã tìm thấy lý do cho việc này: trong chương trình của tôi, tôi nhận được một danh sách int từ mạng sau đó chuyển đổi thành chuỗi map(ord,a)không cần thiết, nhưng tham gia nhu cầu map(chr,a). Đây là điểm chuẩn của tôi pastebin.com/1sKFm8ma
bigeagle

15
Tối ưu hóa sớm. Điều này thật khó đọc và hiểu những gì đang diễn ra. Trừ khi người dùng CẦN hiệu suất trong hoạt động, đơn giản ''.join()là dễ đọc hơn nhiều.
Luiz Damim

5
không đồng ý - lập trình viên cần ghi nhớ các phương pháp nhanh nhất cho những việc đó. một thao tác đơn giản mà mất nhiều thời gian hơn không phải là vấn đề lớn. Tuy nhiên, đây là cách mọi chương trình được viết kết thúc đầy hơi và chiếm quá nhiều tài nguyên. Khi chúng ta không tạo thói quen làm cho mọi thứ trở nên gọn gàng nhất có thể, chúng ta sẽ có một thế giới giống như .... tốt, như Windows Vista, hay Upstart trong Linux là những ví dụ điển hình về nhiều phím tắt nhỏ dẫn đến 'phình to và nổi', như chết trong nước. cả hai đều xấu xí tại sao không sử dụng str (). tham gia (a) là imfho biểu cảm 100% ..
osirisgothra

4

Hàm giảm cũng hoạt động.

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'

1
Nó luôn làm phiền tôi rằng các nhà khai thác không phải là công dân hạng nhất theo cách riêng của họ. Trong sơ đồ, ví dụ, đó sẽ là (giảm + h)
Brian Minton

Trong chương trình, (reduce + '' h)hoặc (apply + h)sẽ làm việc. Nhưng một lần nữa, trong Python, toán tử add cần chính xác 2 toán hạng, do đó cần phải giảm. Mặt khác, bạn có thể làm operator.add(*h), vì applyđã chính thức không dùng Python trong cú pháp cuộc gọi mở rộng (còn gọi là en.wikipedia.org/wiki/Variadic_feft )
Brian Minton

3

Nếu danh sách chứa số, bạn có thể sử dụng map()với join().

Ví dụ:

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459

nó thực sự là nhiều pythonic hơn để sử dụng''.join([str(i) for i in arr])
user1767754 20/12/17

@ user1767754 Chà, Guido thích phong cách đó nhưng hoàn toàn không có gì sai khi sử dụng chức năng bản đồ.
itbruce

2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'

6
Điều này sẽ khá chậm. Việc sử dụng ''.join(h)sẽ vượt xa phương pháp chắp thêm từng cái một của bạn.
Martijn Pieters

1
trong 'kinh thánh' con trăn (hơn 1400 trang một), ở nhiều nơi, nó cho chúng ta biết rằng điều này là sai trái và phải tránh bất cứ khi nào có thể. Nó cũng là một nhãn hiệu rõ ràng đau đớn của người mới bắt đầu trăn không biết (không xúc phạm chức năng ... tốt) nó có thể hoạt động nhưng bạn sẽ nghe thấy "Đừng làm điều này" từ khoảng 5000 người để làm điều đó.
osirisgothra

2

bên cạnh str.joinđó là cách tự nhiên nhất, một khả năng là sử dụng io.StringIOvà lạm dụng writelinesđể viết tất cả các yếu tố trong một lần:

import io

a = ['a','b','c','d']

out = io.StringIO()
out.writelines(a)
print(out.getvalue())

in:

abcd

Khi sử dụng phương pháp này với hàm tạo hoặc lặp không phải là tuplea list, nó sẽ lưu việc tạo danh sách tạm thời joinđể phân bổ kích thước phù hợp trong một lần (và danh sách các chuỗi 1 ký tự rất tốn kém về bộ nhớ ).

Nếu bạn có bộ nhớ thấp và bạn có một đối tượng được đánh giá lười biếng làm đầu vào, phương pháp này là giải pháp tốt nhất.


0

Bạn cũng có thể sử dụng operator.concat()như thế này:

>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'

Nếu bạn đang sử dụng Python 3, bạn cần phải trả trước:

>>> from functools import reduce

kể từ phần dựng sẵn reduce()đã bị xóa khỏi Python 3 và hiện đang sống functools.reduce().

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.