你如何从字符串列表中创建逗号分隔的字符串?

时间:2008-09-04 21:04:05

标签: python list

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

我通常最终会使用类似''.join(map(lambda x: x+',',l))[:-1]的内容,但也感到有点不满意。

编辑:解决方案如此简单,我感到羞愧和高兴。显然我几乎不知道我在做什么。 (我可能在过去需要“简单”连接,并以某种方式记住s.join([e1,e2,...])作为s+e1+e2+...的简写。)

16 个答案:

答案 0 :(得分:775)

myList = ['a','b','c','d']
myString = ",".join(myList )

如果列表包含数字,则无效。


Ricardo Reyes所示,如果它包含非字符串类型(例如整数,浮点数,布尔值,无),则执行:

myList = ','.join(map(str, myList)) 

答案 1 :(得分:63)

为什么地图/ lambda魔术?这不行吗?

>>>foo = [ 'a', 'b', 'c' ]
>>>print ",".join(foo)
a,b,c
>>>print ",".join([])

>>>print ",".join(['a'])
a

编辑:@ mark-biek指出数字的情况。 也许列表理解:

>>>','.join([str(x) for x in foo])

更“pythonic”。

EDIT2: 谢谢你的建议。我将来会使用生成器而不是列表理解。

>>>','.join(str(x) for x in foo)

答案 2 :(得分:15)

",".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'

答案 3 :(得分:13)

这是Python 3.0中的另一种解决方案,它允许使用非字符串列表项:

>>> alist = ['a', 1, (2, 'b')]
  • 标准方式

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
    
  • 替代解决方案

    >>> import io
    >>> s = io.StringIO()
    >>> print(*alist, file=s, sep=', ', end='')
    >>> s.getvalue()
    "a, 1, (2, 'b')"
    

注意:逗号之后的空格是故意的。

答案 4 :(得分:11)

你不只是想要:

",".join(l)

如果你需要在值中引用/转义逗号等,显然会变得更复杂。在这种情况下,我建议查看标准库中的csv模块:

https://docs.python.org/library/csv.html

答案 5 :(得分:11)

@Peter Hoffmann

使用生成器表达式还可以生成迭代器,但可以保存导入的itertools。此外,列表推导通常优先映射,因此,我希望生成器表达式优先于imap。

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 

答案 6 :(得分:5)

>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

my_list可能包含任何类型的变量。这样可以避免结果'A,,,D,E'

答案 7 :(得分:4)

@ jmanning2k使用列表推导具有创建新临时列表的缺点。更好的解决方案是使用itertools.imap,它返回一个迭代器

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))

答案 8 :(得分:3)

l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"

答案 9 :(得分:3)

用于转换包含数字的列表,请执行以下操作:

string  =  ''.join([str(i) for i in list])

答案 10 :(得分:2)

如果您想使用快捷方式:):

','.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)

答案 11 :(得分:1)

除非我遗漏某些内容,否则','.join(foo)应该按照您的要求行事。

>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'

(编辑:正如jmanning2k指出的那样,

','.join([str(x) for x in foo])

更安全而且非常Pythonic,但如果元素可以包含逗号,则生成的字符串很难解析 - 此时,你需要csv模块的全部功能,正如道格拉斯指出的那样答案。)

答案 12 :(得分:1)

以下是列表

的示例
>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

更准确: -

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

示例2: -

myList = ['Apple','Orange']
myList = ','.join(map(str, myList)) 
print "Output:", myList
Output: Apple,Orange

答案 13 :(得分:1)

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

将列表l输出到.csv文件:

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。

答案 14 :(得分:-1)

只是这样的一点:)

String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')

ring = (" , ").join(ding)

print(ring)

输出:一次,一次,一次,一次,一次,一次,一次,一次,一次,

答案 15 :(得分:-2)

我的两分钱。我喜欢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'

它是pythonic,适用于字符串,数字,None和空字符串。它很简短并且满足要求。如果列表不包含数字,我们可以使用这个更简单的变体:

>>> ','.join(ifilter(lambda x: x, l))

此解决方案也不会创建新列表,但使用迭代器,如@Peter Hoffmann指出(谢谢)。