Làm thế nào bạn có thể tạo một chuỗi được phân tách bằng dấu phẩy từ danh sách các chuỗi?


528

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

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

Câu trả lời:


969
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'

Điều này sẽ không hoạt động nếu danh sách chứa số nguyên


Và nếu danh sách chứa các loại không phải chuỗi (như số nguyên, số float, bools, Không có) thì hãy làm:

my_string = ','.join(map(str, my_list)) 

Lưu ý nếu bạn đang sử dụng python 2.7 (mà bây giờ bạn không nên sử dụng) thì việc sử dụng str sẽ đưa ra một ngoại lệ nếu bất kỳ mục nào trong danh sách có unicode.
kroiz

75

Tại sao map/ lambdama thuật? Nó không hoạt động à?

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

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

Trong trường hợp nếu có số trong danh sách, bạn có thể sử dụng mức độ hiểu danh sách:

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

hoặc một biểu thức trình tạo:

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

18

",".join(l)sẽ không làm việc cho tất cả các trường hợp. Tôi khuyên bạn nên sử dụng 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'

Không có StringIOtrong Python 3
Ron Kalian

4
@RonKalian Sử dụng from io import StringIOtrong Python 3
Kevin Ashcraft

13

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

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

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
  • 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 Ý: Không gian sau dấu phẩy là cố ý.



10

@Peter Hoffmann

Sử dụng các biểu thức trình tạo có lợi ích là cũng tạo ra một trình vòng lặp nhưng tiết kiệm nhập itertools. Hơn nữa, việc hiểu danh sách thường được ưu tiên hơn đối với ánh xạ, do đó, tôi hy vọng các biểu thức của trình tạo sẽ được ưu tiên hơn.

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

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

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


4
l=['a', 1, 'b', 2]

print str(l)[1:-1]

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

1
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 chuỗi.
mrdevlar

3

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

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

Giải pháp này không đáp ứng các yêu cầu không thêm dấu phẩy cho chuỗi trống và thêm 'Không' với noneType.
Roberto

kiểm tra str.join công việc nhanh hơn listso với máy phát điện
Grijesh Chauhan

3

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

Chính xác hơn:-

>>> 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

1
Câu hỏi này là về danh sách, không phải danh sách danh sách .
Eero Aaltonen

@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.

1

Tôi muốn nói rằng csvthư viện là lựa chọn hợp lý duy nhất ở đây, vì nó được xây dựng để đối phó với tất cả các trường hợp sử dụng csv như dấu phẩy trong chuỗi, v.v.

Để xuất danh sách lthành tệp .csv:

import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(l)  # this will output l as a single row.  

Cũng có thể sử dụng writer.writerows(iterable)để xuất nhiều hàng sang csv.

Ví dụ này tương thích với Python 3, vì câu trả lời khác ở đây được sử dụng StringIOlà Python 2.


Nhưng không phải là quá nhiều / phức tạp so với các câu trả lời khác?
Sreenikethan tôi

0

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

>>> ','.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])

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


-2

Theo quan điểm của tôi. Tôi thích đơn giản hơn một mã 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 và 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 hơ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 trình vòng lặp, như @Peter Hoffmann đã chỉ (cảm ơn).


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