关于python:如何从字符串列表中创建逗号分隔的字符串?

How would you make a comma-separated string from a list of strings?

将字符串从一个序列中连接起来,以便在两个连续对之间添加一个逗号,您的首选方法是什么?也就是说,您如何将[ 'a', 'b', 'c' ]映射到'a,b,c'?(病例[ s ][]分别对应s''

我通常会使用像''.join(map(lambda x: x+',',l))[:-1]这样的东西,但也会有点不满意。

编辑:解决方案这么简单,我既感到羞耻又高兴。显然,我对自己在做什么一无所知。(在过去,我可能需要"简单"的连接,并以某种方式记住s.join([e1,e2,...])作为s+e1+e2+...的简写。)


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)


",".join(l)不适用于所有情况。我建议将csv模块与stringio一起使用

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'

my_list可以包含任何类型的变量。这样就避免了结果'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"


我认为csv库是这里唯一明智的选择,因为它是为处理所有csv用例而构建的,例如字符串中的逗号等。

要将列表l输出到.csv文件,请执行以下操作:

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.

也可以使用writer.writerows(iterable)将多行输出到csv。

这个例子与python 3兼容,因为这里的另一个答案使用了StringIO,即python 2。


下面是一个带列表的示例

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


除非我遗漏了什么,否则','.join(foo)应该按照你的要求做。

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式的,尽管如果元素可以包含逗号,结果字符串将很难解析——此时,您需要csv模块的全部功能,正如道格拉斯在回答中指出的那样。)


只是像这样的一点点:)

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(谢谢)。