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

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


推荐阅读

    linux连接多条命令?

    linux连接多条命令?,工具,情况,命令,分行,服务,地址,连续,终端,窗口,主机,lin

    linux有线网连接命令?

    linux有线网连接命令?,系统,网络,软件,电脑,密码,地址,信息,虚拟机,终端,命

    linux编译连接命令?

    linux编译连接命令?,系统,代码,环境,工具,文件,资料,电脑,百度,终端,命令,在l

    linux上的软连接命令?

    linux上的软连接命令?,系统,设备,位置,链接,文件,数据,交通,地方,信息,地址,L

    域名映射命令linux?

    域名映射命令linux?,地址,网络,信息,系统,服务,命令,电脑,管理,网址,数字,如

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    mac命令连接linux?

    mac命令连接linux?,系统,软件,电脑,密码,公司,网络,地址,通用,服务,发展,macb

    远程连接命令linux?

    远程连接命令linux?,服务,系统,密码,网络,软件,名称,电脑,资料,地址,信息,远

    linux连续输入命令?

    linux连续输入命令?,系统,工作,地址,连续,命令,信息,电脑,基础,标准,状态,lin

    linux命令行连接达梦?

    linux命令行连接达梦?,系统,传播,概念,公司,环境,信息,资料,数据库,浏览器,

    linux查询连接命令?

    linux查询连接命令?,网络,服务,系统,信息,单位,地址,状态,管理,基础,命令,如

    linux命令行远程连接?

    linux命令行远程连接?,地址,密码,系统,环境,工作,服务,电脑,图片,网络,软件,

    linux远程连接命令?

    linux远程连接命令?,软件,密码,系统,名称,图片,网络,电脑,地址,信息,健康,Xsh

    linux连接文件命令?

    linux连接文件命令?,系统,工具,标准,情况,数据,命令,单位,发行,数字,正规,Lin

    linux取消软连接命令?

    linux取消软连接命令?,地址,服务,工具,软件,数据,名称,命令,首页,工作,端口,

    linux重新连接命令?

    linux重新连接命令?,服务,工作,设备,标准,名称,系统,网络,命令,信息,网络服

    linux下的命令连接?

    linux下的命令连接?,服务,密码,认证,系统,工具,形态,位置,网络,标准,时间,详

    linux连接状态命令?

    linux连接状态命令?,网络,地址,状态,信息,系统,工具,工作,服务,位置,命令,lin

    linux连接url命令?

    linux连接url命令?,系统,传播,数据,地址,网站,网址,工具,项目,电脑,位置,linu

    linux命令连接服务器?

    linux命令连接服务器?,系统,服务,软件,工作,地址,基础知识,数据,管理,状态,