Câu trả lời:
Sử dụng join
phươ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'
' '.join(list)
với một khoảng trống giữa các trích dẫn
"".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"
.
Đ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 join
phương thức nằm trên str
lớp:
# this is the Python way
"".join(['a','b','c','d'])
Tại sao join
khô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 str
như một dấu phân cách (trong trường hợp str
nà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ó.
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.
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 b
sẽ là 'abcd'
.
Đâ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'
''.join(['a','b','c'])
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
''.join()
là dễ đọc hơn nhiều.
Hàm giảm cũng hoạt động.
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
(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 )
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
''.join([str(i) for i in arr])
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
''.join(h)
sẽ vượt xa phương pháp chắp thêm từng cái một của bạn.
bên cạnh str.join
đó là cách tự nhiên nhất, một khả năng là sử dụng io.StringIO
và 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à tuple
a 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.
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()
.