从列表创建以逗号分隔的字符串

8 投票
3 回答
29584 浏览
提问于 2025-04-18 12:01

我有一个整数的列表,想把它们变成一个用逗号分隔的字符串。下面的代码:

x = [3, 1, 4, 1, 5]
y = ",".join(x)

出现了错误:

TypeError: sequence item 0: expected string, int found

我该怎么做才能创建这个字符串呢?我可以手动把每个整数转换成字符串,然后放到一个新列表里,最后再把这个新列表合并成一个字符串,但我在想有没有更简单的方法。

3 个回答

2

只需要修改一下join的参数,让每个元素都变成字符串就可以了:

x = [3, 1, 4, 1, 5]
y = ",".join(str(i) for i in x)
4

如果你在处理一个复杂的csv文件,而不是简单的例子,请记得使用csv模块来读取和写入csv文件,因为CSV格式可能会比你想象的复杂得多

下面是一个写入的例子:

import csv

x = [['Header\n1', 'H 2', 'H 3', 'H, 4'],[1,2,3,4],[5,6,7,8],[9,10,11,12]]

with open('/tmp/test.csv', 'w') as fout:
    writer=csv.writer(fout)
    for l in x:
        writer.writerow(l)

注意在'H, 4'中的逗号和在'Header\n1'中的换行符,如果没有正确编码,这可能会让你在解码时遇到麻烦。

csv模块生成的文件'test.csv'如下:

"Header
1",H 2,H 3,"H, 4"
1,2,3,4
5,6,7,8
9,10,11,12

注意文件中"Header\n1"和"H, 4"周围的引号,这样可以确保将来正确解码csv。

现在检查一下你是否能把它读回来:

with open('/tmp/test.csv') as f:
    csv_in=[[int(e) if e.isdigit() else e for e in row] 
               for row in csv.reader(f)]

>>> csv_in==x
True

我只是想说,通常使用库中的工具来处理csv文件会更好。

14

str.join 这个方法只接受字符串的集合,而不能接受整数的集合。根据官方文档的说明:

str.join(iterable)

这个方法会返回一个字符串,它是将可迭代对象 iterable 中的字符串连接起来的结果。

所以,你需要把 x 中的元素转换成字符串。你可以使用map 方法或者列表推导式来实现这个转换:

x = [3, 1, 4, 1, 5]
y = ",".join(map(str, x))

x = [3, 1, 4, 1, 5]
y = ",".join([str(item) for item in x])

下面是一个演示:

>>> x = [3, 1, 4, 1, 5]
>>>
>>> ",".join(map(str, x))
'3,1,4,1,5'
>>>
>>> ",".join([str(item) for item in x])
'3,1,4,1,5'
>>>

撰写回答