How would you make a comma-separated string from a list of strings?
将字符串从一个序列中连接起来,以便在两个连续对之间添加一个逗号,您的首选方法是什么?也就是说,您如何将
我通常会使用像
编辑:解决方案这么简单,我既感到羞耻又高兴。显然,我对自己在做什么一无所知。(在过去,我可能需要"简单"的连接,并以某种方式记住
1 2 | myList = ['a','b','c','d'] myString =",".join(myList ) |
如果列表中包含数字,这将不起作用。
如Ricardo Reyes建议的,如果它包含非字符串类型(如整数、浮点数、bools、none),则执行以下操作:
1 | myList = ','.join(map(str, myList)) |
号
为什么要使用地图/lambda魔法?这不管用吗?
1 2 3 4 5 6 7 | >>>foo = [ 'a', 'b', 'c' ] >>>print",".join(foo) a,b,c >>>print",".join([]) >>>print",".join(['a']) a |
编辑:@mark biek指出数字的大小写。也许列表理解:
1 | >>>','.join([str(x) for x in foo]) |
。
更像是"Python"。
编辑2:谢谢你的建议。以后我将使用生成器而不是列表理解。
1 | >>>','.join(str(x) for x in foo) |
1 2 3 4 5 6 7 8 9 10 11 12 | 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 ' |
号
下面是python 3.0中的另一种解决方案,它允许非字符串列表项:
1 | >>> alist = ['a', 1, (2, 'b')] |
号
标准方法
1
2>>>",".join(map(str, alist))
"a, 1, (2, 'b')"号
替代方案
1
2
3
4
5>>> import io
>>> s = io.StringIO()
>>> print(*alist, file=s, sep=', ', end='')
>>> s.getvalue()
"a, 1, (2, 'b')"号
注意:逗号后的空格是有意的。
@彼得·霍夫曼
使用生成器表达式的好处是还可以生成迭代器,但可以节省导入itertools。此外,列表理解通常优先于映射,因此,我希望生成器表达式优先于IMAP。
1 2 3 | >>> l = [1,"foo", 4 ,"bar"] >>>",".join(str(bit) for bit in l) '1,foo,4,bar' |
你难道不想:
1 | ",".join(l) |
。
显然,如果需要在值中引用/转义逗号等,则会变得更复杂。在这种情况下,我建议查看标准库中的csv模块:
https://docs.python.org/library/csv.html网站
1 2 3 | >>> my_list = ['A', '', '', 'D', 'E',] >>>",".join([str(i) for i in my_list if i]) 'A,D,E' |
号
@使用列表理解的jmanning2K有创建新临时列表的缺点。更好的解决方案是使用itertools.imap返回迭代器
1 2 3 | from itertools import imap l = [1,"foo", 4 ,"bar"] ",".join(imap(str, l)) |
。
要转换包含数字的列表,请执行以下操作:
1 | string = ''.join([str(i) for i in list]) |
号
1 2 3 4 5 | l=['a', 1, 'b', 2] print str(l)[1:-1] Output:"'a', 1, 'b', 2" |
。
我认为
要将列表
1 2 3 4 | 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. |
号
也可以使用
这个例子与python 3兼容,因为这里的另一个答案使用了
下面是一个带列表的示例
1 2 3 4 | >>> myList = [['Apple'],['Orange']] >>> myList = ','.join(map(str, [i[0] for i in myList])) >>> print"Output:", myList Output: Apple,Orange |
号
更准确地说:
1 2 3 4 | >>> myList = [['Apple'],['Orange']] >>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) >>> print"Output:", myList Output: Apple,Orange |
号
例2:
1 2 3 4 | myList = ['Apple','Orange'] myList = ','.join(map(str, myList)) print"Output:", myList Output: Apple,Orange |
号
除非我遗漏了什么,否则
1 2 3 4 5 6 | >>> ','.join(['']) '' >>> ','.join(['s']) 's' >>> ','.join(['a','b','c']) 'a,b,c' |
。
(编辑:正如JManning2K指出的,
1 | ','.join([str(x) for x in foo]) |
更安全,也更像是Python式的,尽管如果元素可以包含逗号,结果字符串将很难解析——此时,您需要
只是像这样的一点点:)
1 2 3 4 5 6 | String ="Once:Upon:a:Time:A:Long:Time:Ago" ding = String.split(':') ring = (" ,").join(ding) print(ring) |
号
输出:一次,一次,一次,一次,一次,很久,一次,以前
我的两分钱。我喜欢更简单的一行代码:
1 2 3 4 5 6 7 | >>> 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,适用于字符串、数字、无和空字符串。它很短,满足要求。如果列表不包含数字,我们可以使用这个简单的变体:
1 | >>> ','.join(ifilter(lambda x: x, l)) |
。
另外,这个解决方案不创建新的列表,而是使用迭代器,如@peter hoffmann point(谢谢)。