2008-09-04 36 views
288

Điều gì sẽ là cách ưa thích của bạn để nối chuỗi từ một chuỗi sao cho giữa mỗi cặp liên tiếp một dấu phẩy được thêm vào. Tức là, làm cách nào để bạn lập bản đồ, ví dụ: [ 'a', 'b', 'c' ] đến 'a,b,c'? (Các trường hợp [ s ][] nên được ánh xạ tới s'', tương ứng).Bạn sẽ tạo chuỗi được phân cách bằng dấu phẩy từ danh sách như thế nào?

tôi thường kết thúc bằng một cái gì đó giống như ''.join(map(lambda x: x+',',l))[:-1], nhưng cũng cảm thấy chút gì không hài lòng.

Chỉnh sửa: Tôi vừa xấu hổ vừa vui vì giải pháp đơn giản như vậy. Rõ ràng tôi không có một đầu mối nào về những gì tôi đang làm. (Tôi có lẽ cần nối "đơn giản" trong quá khứ và bằng cách nào đó nhớ s.join([e1,e2,...]) như một cách viết tắt cho s+e1+e2+....)

Trả lời

550
myList = ['a','b','c','d'] 
myString = ",".join(myList) 

này sẽ không hoạt động nếu danh sách chứa số.


Như Ricardo Reyes đề nghị, nếu nó có chứa loại không theo chuỗi (ví dụ như số nguyên, phao, bools, Không) rồi thực hiện:

myList = ','.join(map(str, myList)) 
+69

bạn nói đúng, nó sẽ không hoạt động nếu danh sách chứa các số, nhưng theo cách này nó sẽ: myList = ','. Join (map (str, myList)) –

+0

Ah tuyệt vời! Tôi sẽ sử dụng map() trong tương lai. Tôi đã luôn luôn thực hiện: myString = "," tham gia ([str (x) cho x trong myList]) –

+6

'myString =", ". Join (myList)' ngay cả khi danh sách chứa số. Tôi đã thử nó. – zengr

55

Tại sao bản đồ/lambda kỳ diệu? Điều này có hiệu quả không?

>>>foo = [ 'a', 'b', 'c' ] 
>>>print ",".join(foo) 
a,b,c 
>>>print ",".join([]) 

>>>print ",".join(['a']) 
a 

Chỉnh sửa: @ mark-biek chỉ ra trường hợp cho số. Có lẽ danh sách hiểu:

>>>','.join([str(x) for x in foo]) 

là "pythonic" hơn.

Chỉnh sửa2: Cảm ơn các đề xuất. Tôi sẽ sử dụng máy phát điện thay vì danh sách hiểu trong tương lai.

>>>','.join(str(x) for x in foo) 
+0

'>>> ','. Tham gia (str (x) cho x trong foo)' là khá mát mẻ !! – Marslo

+3

Nếu tôi muốn 'a, b và c' thì sao? – Hussain

+0

@Hussain: '", ".join (foo [: - 2] + [" và ".join (foo [-2:])])' hoặc nếu bạn có thể nhận được số: '", ".join (itertools .chain ((str (i) cho i trong một [: - 2]), ["và" .join (str (i) cho i trong một [-2:])])) ' –

10

Đừng bạn chỉ muốn:

",".join(l) 

Rõ ràng nó trở nên phức tạp hơn nếu bạn cần phải trích dẫn/thoát khỏi dấu phẩy vv trong các giá trị. Trong trường hợp đó tôi sẽ đề nghị xem xét các mô-đun csv trong thư viện chuẩn:

https://docs.python.org/library/csv.html

1

Trừ khi tôi là thiếu cái gì, ','.join(foo) nên làm những gì bạn đang xin.

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

(chỉnh sửa: và như jmanning2k chỉ ra,

','.join([str(x) for x in foo]) 

là an toàn hơn và khá Pythonic, mặc dù chuỗi kết quả sẽ rất khó để phân tích nếu các yếu tố có thể chứa dấu phẩy - vào thời điểm đó, bạn cần toàn bộ sức mạnh của mô-đun csv, như Douglas chỉ ra trong câu trả lời của mình.)

4

@ jmanning2k sử dụng danh sách hiểu có nhược điểm tạo ra một danh sách tạm thời mới. Các giải pháp tốt hơn sẽ được sử dụng itertools.imap mà trả về một iterator

from itertools import imap 
l = [1, "foo", 4 ,"bar"] 
",".join(imap(str, l)) 
+0

Giải pháp này không đáp ứng các yêu cầu của việc không thêm dấu phẩy thừa cho chuỗi rỗng và thêm 'Không có' với NoneType. – Roberto

8

@ Peter Hoffmann

Sử dụng biểu thức máy phát điện có lợi ích của sản xuất cũng một iterator nhưng tiết kiệm itertools nhập khẩu. Hơn nữa, việc hiểu danh sách thường được ưa thích hơn với bản đồ, do đó, tôi mong đợi các biểu thức máy phát sẽ được ưu tiên hơn để imap.

>>> l = [1, "foo", 4 ,"bar"] 
>>> ",".join(str(bit) for bit in l) 
'1,foo,4,bar' 
3
l=['a', 1, 'b', 2] 

print str(l)[1:-1] 

Output: "'a', 1, 'b', 2" 
+0

Tôi nghĩ bạn nên chỉ ra rằng không giống như các giải pháp khác trên trang này, bạn cũng trích dẫn các chuỗi. – mrdevlar

8

Đây là một giải pháp thay thế bằng Python 3.0 cho phép danh sách không theo chuỗi mục:

>>> alist = ['a', 1, (2, 'b')] 
  • một cách tiêu chuẩn

    >>> ", ".join(map(str, alist)) 
    "a, 1, (2, 'b')" 
    
  • các giải pháp thay thế

    >>> import io 
    >>> s = io.StringIO() 
    >>> print(*alist, file=s, sep=', ', end='') 
    >>> s.getvalue() 
    "a, 1, (2, 'b')" 
    

LƯU Ý: Khoảng trống sau dấu phẩy là cố ý.

3

để chuyển đổi danh sách có chứa số làm như sau:

string = ''.join([str(i) for i in list]) 
7

",".join(l) sẽ không làm việc cho tất cả các trường hợp. Tôi muốn đề nghị sử dụng các mô-đun csv với StringIO

import StringIO 
import csv 

l = ['list','of','["""crazy"quotes"and\'',123,'other things'] 

line = StringIO.StringIO() 
writer = csv.writer(line) 
writer.writerow(l) 
csvcontent = line.getvalue() 
# 'list,of,"[""""""crazy""quotes""and\'",123,other things\r\n' 
0

Dưới đây là một ví dụ với danh sách

>>> myList = [['Apple'],['Orange']] 
>>> myList = ','.join(map(str, [i[0] for i in myList])) 
>>> print "Output:", myList 
Output: Apple,Orange 

Nhiều chính xác: -

>>> myList = [['Apple'],['Orange']] 
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) 
>>> print "Output:", myList 
Output: Apple,Orange 

Ví dụ 2: -

myList = ['Apple','Orange'] 
myList = ','.join(map(str, myList)) 
print "Output:", myList 
Output: Apple,Orange 
+0

Câu hỏi này là về danh sách, không phải * danh sách các danh sách *. –

+0

@EeroAaltonen Tôi đã cập nhật Câu trả lời của tôi, Cảm ơn bạn đã chỉ cho tôi đúng. –

2
>>> my_list = ['A', '', '', 'D', 'E',] 
>>> ",".join([str(i) for i in my_list if i]) 
'A,D,E' 

my_list có thể chứa bất kỳ loại biến nào. Điều này tránh được kết quả 'A,,,D,E'.

-1

Hai xu của tôi. Tôi thích mã đơn giản hơn một dòng trong python:

>>> from itertools import imap, ifilter 
>>> l = ['a', '', 'b', 1, None] 
>>> ','.join(imap(str, ifilter(lambda x: x, l))) 
a,b,1 
>>> m = ['a', '', None] 
>>> ','.join(imap(str, ifilter(lambda x: x, m))) 
'a' 

Đó là pythonic, hoạt động cho chuỗi, số, Không có chuỗi rỗng. Nó ngắn và đáp ứng các yêu cầu. Nếu danh sách sẽ không chứa số, chúng ta có thể sử dụng biến thể đơn giản này:

>>> ','.join(ifilter(lambda x: x, l)) 

Ngoài ra giải pháp này không tạo ra một danh sách mới, nhưng sử dụng một iterator, như @ Peter Hoffmann chỉ (nhờ).

+0

Điều này là không cần thiết. Câu trả lời được chấp nhận đơn giản, trực tiếp và rõ ràng là giải pháp tốt nhất. Để cung cấp lựa chọn thay thế quá phức tạp là một sự lãng phí vô nghĩa của thời gian. Nếu bạn chỉ cố gắng để giáo dục về các tính năng khác của ngôn ngữ khi đã có một câu trả lời khả thi, bạn đang làm điều tương tự bạn downvoted tôi cho. – clearlight

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