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

694
您有什么偏好的方法来连接来自序列的字符串,以便在每两个连续的对之间添加逗号。也就是说,例如如何将['a','b','c']映射到'a,b,c'?(情况['s'][]应分别映射到's'''。)我通常会使用类似于''.join(map(lambda x: x+',',l))[:-1]的东西,但也感到有些不满意。

这个回答解决了你的问题吗?如何将列表中的项目连接成单个字符串? - Georgy
15个回答

1297
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'

如果列表中包含整数,则此方法无法正常工作。


如果列表包含非字符串类型(例如整数、浮点数、布尔值、空值),则执行以下操作:

my_string = ','.join(map(str, my_list)) 

1
请注意,如果您正在使用 Python 2.7(现在不应该这样做),则使用 str 将在列表中的任何项目具有 Unicode 时引发异常。 - kroiz
我的需求是填充一个SQL的“WHERE x NOT IN ()”子句,这也是我来到这里的原因。join()函数可以在元素之间插入任何字符串,但对于列表的每个末尾却没有作用。所以这个方法可行:nameString = '"{}"'.format('", "'.join(nameList)) 这些是单引号,包含所需的双引号字符串。Python 3.7 - Martin Bramwell
为什么Python没有一个专业的函数来执行这个操作? - user2585501
1
值得注意的是,这个答案发布已经超过13年了。我猜自那时以来Python已经发生了很多变化。 - Mark Biek

94

为什么需要使用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)

29

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

Python 3 中没有 StringIO - Ron Kalian
7
在Python 3中,使用from io import StringIO - Kevin Ashcraft

18

使用生成器表达式的好处是可以生成迭代器,而不需要导入itertools模块。此外,与map相比通常更喜欢使用列表推导式,因此我希望使用生成器表达式而不是imap。

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

专家们,请问为什么这个解决方案没有被评为最佳解决方案?它可以处理整数、字符串(包括“疯狂字符”),而且只需要一行代码。作为新手,我想知道这种方法的局限性。 - Roman Korobko
你好,有没有办法让字符串字面值在这里保持为字符串? - Mehar Fatima Khan

17

以下是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')"
    

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


    14

    您是否只是想要:

    ",".join(l)
    

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

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


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

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


    10
    l=['a', 1, 'b', 2]
    
    print str(l)[1:-1]
    
    Output: "'a', 1, 'b', 2"
    

    2
    我认为你应该指出,与此页面上的其他解决方案不同,你也引用了字符串。 - mrdevlar

    7

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

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

    这个解决方案不能满足不在空字符串中添加额外逗号以及在NoneType中添加'None'的要求。 - Roberto
    使用list比生成器更快地运行str.join - Grijesh Chauhan

    5
    如果你想要使用快捷方式 :) :
    ','.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)
    

    为什么是-2而不是-1? - cksrc

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