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

python list

517643 观看

15回复

8223 作者的声誉

您最好采用哪种方法来连接序列中的字符串,以便在每两个连续对之间添加一个逗号。也就是说,例如,您如何映射[ 'a', 'b', 'c' ]'a,b,c'?(案例[ s ][]应该分别映射到s''。)

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

编辑:我很as愧,很高兴解决方案是如此简单。显然,我几乎不知道自己在做什么。(过去,我可能需要“简单”的串联,并以某种方式记忆s.join([e1,e2,...])为的简写s+e1+e2+...。)

作者: mweerden 的来源 发布者: 2008 年 9 月 4 日

回应 15


841

98145 作者的声誉

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

如果列表包含数字,则此功能将无效。


正如Ricardo Reyes所建议的那样,如果它包含非字符串类型(例如整数,浮点数,布尔值,无),则请执行以下操作:

myString = ','.join(map(str, myList)) 
作者: Mark Biek 发布者: 2008 年 9 月 4 日

67

7956 作者的声誉

为什么使用地图/ 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)
作者: jmanning2k 发布者: 2008 年 9 月 4 日

11

45509 作者的声誉

你不只是想要:

",".join(l)

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

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

作者: Douglas Leeder 发布者: 2008 年 9 月 4 日

1

942 作者的声誉

除非我缺少任何东西,否则','.join(foo)应该按照您的要求进行。

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

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

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

是更安全且相当Pythonic的,尽管如果元素可以包含逗号,则生成的字符串将很难解析-那时,您需要csv模块的全部功能,正如Douglas在他的回答中指出的那样。)

作者: David Singer 发布者: 2008 年 9 月 4 日

4

38044 作者的声誉

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

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
作者: Peter Hoffmann 发布者: 2008 年 9 月 4 日

11

85318 作者的声誉

彼得·霍夫曼(Peter Hoffmann)

使用生成器表达式的好处是还可以生成迭代器,但是可以节省导入itertools的时间。此外,列表推导通常首选映射,因此,我希望生成器表达式比imap首选。

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 
作者: Aaron Maenpaa 发布者: 2008 年 9 月 5 日

3

0 作者的声誉

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

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"
作者: gregrogers 发布者: 2008 年 9 月 15 日

14

290141 作者的声誉

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

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

作者: jfs 发布者: 2008 年 10 月 1 日

3

47 作者的声誉

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

string  =  ''.join([str(i) for i in list])
作者: phantom 发布者: 2012 年 9 月 6 日

15

16672 作者的声誉

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

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'
作者: Ricky 发布者: 2016 年 2 月 10 日

1

0 作者的声誉

这是清单的例子

>>> 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
作者: user7561216 发布者: 2017 年 5 月 15 日

5

1281 作者的声誉

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

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

作者: Shameem 发布者: 2017 年 5 月 20 日

-2

188 作者的声誉

我的两分钱。我喜欢更简单的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,适用于字符串,数字,无和空字符串。它很短并且满足要求。如果列表中不包含数字,则可以使用以下更简单的变体:

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

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

作者: Roberto 发布者: 2018 年 1 月 7 日

-1

1 作者的声誉

只是有点像这样:)

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

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

print(ring)

输出:一次,时间,a,时间,A,长时间,前

作者: Mal 发布者: 2018 年 4 月 24 日

1

1280 作者的声誉

我要说的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。

作者: Ron Kalian 发布者: 2018 年 6 月 18 日
32x32