从一个序列中连接字符串,使每两个连续的对之间添加一个逗号,您的首选方法是什么?也就是说,你如何映射,例如,['a', 'b', 'c']到'a,b,c'?(case ['s']和[]应该分别映射为's'和''。)
我通常会用“。”Join (map(lambda x: x+',',l))[:-1],但也感到有些不满意。
从一个序列中连接字符串,使每两个连续的对之间添加一个逗号,您的首选方法是什么?也就是说,你如何映射,例如,['a', 'b', 'c']到'a,b,c'?(case ['s']和[]应该分别映射为's'和''。)
我通常会用“。”Join (map(lambda x: x+',',l))[:-1],但也感到有些不满意。
当前回答
",".join(l)并不适用于所有情况。我建议使用StringIO的csv模块
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'
其他回答
除非我遗漏了什么,','.join(foo)应该做你所要求的。
>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'
(编辑:正如jmanning2k指出的那样,
','.join([str(x) for x in foo])
更安全,而且相当python化,尽管如果元素可以包含逗号,则结果字符串将难以解析——在这一点上,您需要csv模块的全部功能,Douglas在他的回答中指出。)
为什么是map/lambda魔法?这样不行吗?
>>> foo = ['a', 'b', 'c']
>>> print(','.join(foo))
a,b,c
>>> print(','.join([]))
>>> print(','.join(['a']))
a
如果列表中有数字,你可以使用列表推导式:
>>> ','.join([str(x) for x in foo])
或者一个生成器表达式:
>>> ','.join(str(x) for x in foo)
我的意见。我喜欢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'
它是python的,适用于字符串,数字,None和空字符串。它很短,满足要求。如果列表不包含数字,我们可以使用这个更简单的变体:
>>> ','.join(ifilter(lambda x: x, l))
此外,这个解决方案不创建一个新的列表,而是使用一个迭代器,如@Peter Hoffmann pointing(谢谢)。
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'
如果列表包含整数,这将不起作用
如果列表包含非字符串类型(如整数、浮点数、bool、None),则执行以下操作:
my_string = ','.join(map(str, my_list))
如果你想做快捷方式:):
','.join([str(word) for word in wordList])
但如果你想用逻辑来炫耀:):
wordList = ['USD', 'EUR', 'JPY', 'NZD', 'CHF', 'CAD']
stringText = ''
for word in wordList:
stringText += word + ','
stringText = stringText[:-2] # get rid of last comma
print(stringText)