2009-01-31 47 views
200

Trong Python, tôi có thể làm:Python String.Join (danh sách) trên mảng đối tượng chứ không phải là chuỗi mảng

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

Có cách nào dễ dàng để làm như vậy khi tôi có một danh sách các đối tượng?

>>> class Obj: 
...  def __str__(self): 
...   return 'name' 
... 
>>> list = [Obj(), Obj(), Obj()] 
>>> ', '.join(list) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence item 0: expected string, instance found 

Hoặc tôi có phải sử dụng vòng lặp for không?

Trả lời

301

Bạn có thể sử dụng một sự hiểu biết danh sách hoặc một biểu thức máy phát điện thay vì:

', '.join([str(x) for x in list]) # list comprehension 
', '.join(str(x) for x in list) # generator expression 
+1

hoặc một biểu thức máy phát điện: '' .join (str (x) cho x trong danh sách) –

+0

bất kỳ ý tưởng nào về chúng sẽ nhanh hơn? – gozzilli

+0

Các thí nghiệm của tôi nói rằng danh sách hiểu có thể nhanh hơn 60% trên các danh sách nhỏ (thử nghiệm chạy 10^6 lần trong danh sách ba đối tượng() s). Tuy nhiên, hiệu suất của chúng tương tự nhau trên các danh sách lớn (thí nghiệm thứ 2 chạy một lần trên danh sách 10^7 đối tượng()). – gozzilli

63

Việc xây dựng trong constructor chuỗi sẽ tự động gọi obj.__str__:

''.join(map(str,list)) 
+1

map() không thay đổi danh sách, nó tương đương với [str (o) cho o trong danh sách] –

+9

+1: Bản đồ là tốt tiếp cận; "thay đổi danh sách" không phải là nhận xét chính xác. –

+1

(khác) +1 .. bản đồ không phải là ít có thể đọc được, chỉ cần biết chức năng bản đồ là gì – lapax

Các vấn đề liên quan