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

8
我有一个整数列表,想要创建一个逗号分隔的字符串。下面是代码示例:
x = [3, 1, 4, 1, 5]
y = ",".join(x)

给出错误提示:

TypeError: sequence item 0: expected string, int found

我该如何创建字符串?我可以手动将每个元素从int转换为string,将其插入新列表,然后在此新列表上执行join操作,但我想知道是否有更简洁的解决方案。


3
你可以使用mapy = ",".join(map(str, x))。这行代码的作用是将列表x中的元素转换成字符串后,用逗号连接它们并赋值给变量y。 - mdml
1
如果你的列表保证只有整数,那么使用 str.join 是可以的。但是对于任何严肃的事情,请使用 csv 模块,它可以处理许多边角情况。 - Paulo Scardine
3个回答

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

@IoannisFilippidis - 使用列表推导与 str.join 更高效。有关详情,请参阅此处:https://dev59.com/AWox5IYBdhLWcg3wpV_F#9061024 - user2555451
非常有趣,谢谢您注意到这一点。我认为它会成为答案的有价值补充。 - 0 _

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工具。


2

只需修改join的参数,以便将每个元素转换为字符串:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接