将字符列表转换为字符串


Answers:


585

使用join空字符串的方法将所有字符串以及中间的空字符串连接在一起,如下所示:

>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'

1
如何在字符之间添加空格?无论如何要做而又不遍历整个事情?
clifgray

18
只需' '.join(list)在引号之间

一件好事是,如果您想将一个列表写到txt并为每个项目添加新行,则可以使用'\ n'.join(a)
Norfeldt 2013年

28
澄清:"".join(['a','b','c'])Join all elements of the array, separated by the string ""。以同样的方式," hi ".join(["jim", "bob", "joe"])将创建"jim hi bob hi joe"
2014年

39

这可以在许多流行的语言(例如JavaScript和Ruby)中使用,为什么不能在Python中使用?

>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'

奇怪的是,在Python中,join方法在str类上:

# this is the Python way
"".join(['a','b','c','d'])

为什么对象中join的方法list不像JavaScript或其他流行的脚本语言那样?这是Python社区如何思考的一个示例。由于join返回的是字符串,因此应将其放置在字符串类中,而不是列表类中,因此该str.join(list)方法意味着:使用str分隔符将列表连接到新字符串中(本例中str为空字符串)。

过了一段时间,我莫名其妙地爱上了这种思维方式。我可以抱怨Python设计中的很多事情,但不能抱怨它的连贯性。


1
连接是字符串方法而不是列表方法的主要原因是它接受任何可迭代的对象,而不仅仅是列表。您可以使用生成器表达式,字典,集合,各种视图等。因此,与大多数语言中的数组联接操作相比,它要灵活得多。
rosuav '16

我正在将Python string.join()与大多数使用join()多种动态语言的方法进行比较。关于可迭代对象,我想对于此类语言来说这不是问题,因为将可迭代对象封装在集合构造函数中并在join()方法中进行链接同样容易(而且清晰易懂)。
Paulo Scardine '16年

是的,假设他们要么有懒惰的列表(Haskell风格),要么对在开始之前将列表合并到内存中感到满意。我的观点是,Python的工作方式不是任意的,它有很好的理由。
rosuav '16

1
这不是任意的,这是避免在每个类中污染名称空间的设计决定。:-)
Paulo Scardine

究竟。另外,并非所有这些都甚至是类-“可迭代”是协议,而不是类。您可以使用任何可迭代的函数进行过滤,映射,联接等。
rosuav

15

如果您的Python解释器较旧(例如,1.5.2在某些较旧的Linux发行版中很常见),则您可能无法join()在任何旧的字符串对象上将其用作方法,而需要使用字符串模块。例:

a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

except AttributeError:
    import string
    b = string.join(a, '')

字符串b将为'abcd'


10

这可能是最快的方法:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'

4
@WinstonEwert是的,昨天我正在编写一个程序,该程序需要执行此操作,并且在我的程序中基准测试了此行数的性能的几种方法,结果表明,它的速度比那时快约20%''.join(['a','b','c'])
bigeagle 2012年

2
我自己的基准测试显示加入速度要快7倍。pastebin.com/8nSc5Ek1。您介意分享基准吗?
Winston Ewert'4

1
@WinstonEwert你是对的。我发现了这种情况的原因:在程序中,我从网络中接收了一个int列表,然后将其转换为字符串,这map(ord,a)是不必要的,但需要join map(chr,a)。这是我的基准pastebin.com/1sKFm8ma
bigeagle 2012年

15
过早的优化。这是如此难以理解和理解。除非用户需要操作中的性能,否则简单''.join()易读得多。
Luiz Damim 2012年

5
不同意-程序员需要记住此类事情的最快方法。只需花费一点时间的简单操作就没什么大不了的。但是,这几乎就是每个编写的程序最终都会肿并占用过多资源的方式。当我们不养成使事情变得尽可能苗条的习惯时,我们最终会遇到一个类似...的世界……Windows Vista或Linux中的Upstart就是许多导致“浮起来”,就像死在水中一样。他们俩也丑陋。为什么不使用具有100%表达力的str()。join(a)。– osirisgothra
2015年

4

减少功能也起作用

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'

1
总是让我感到困惑的是,运营商本身并不是一流的公民。例如,在方案中,这将是(reduce + h)
Brian Minton

在计划中,(reduce + '' h)还是(apply + h)行得通的。但是再一次,在Python中,add运算符恰好采用2个操作数,因此需要reduce。否则,你可以做operator.add(*h),因为apply已经在Python正式弃用,取而代之的扩展调用语法(又名的en.wikipedia.org/wiki/Variadic_function
布赖恩·明顿

3

如果列表包含数字,则可以map()与结合使用join()

例如:

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459

它实际上是更''.join([str(i) for i in arr])
pythonic的

@ user1767754好吧,Guido更喜欢那种风格,但是使用map函数绝对没有错。
itsbruce

2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'

6
这会很慢。使用''.join(h)将远远超过您的一对一追加方法。
马丁·彼得斯

1
在“蟒蛇圣经”(即1400+页的第一页)中,它在许多地方告诉我们这样做是错误的,应尽可能避免。这也是不了解python的初学者的一个痛苦的显而易见的商标(不要侮辱功能...很好),它可能起作用,但是您会听到大约5000个人的“不这样做”的消息。
osirisgothra,2015年

2

除了str.join这是最自然的方式,一种可能性是使用io.StringIO和滥用一次writelines编写所有元素:

import io

a = ['a','b','c','d']

out = io.StringIO()
out.writelines(a)
print(out.getvalue())

印刷品:

abcd

当将此方法与生成器函数或不是a tuple或a 的可迭代器一起使用时list,它将保存临时创建的列表,该列表join确实可以一次性分配正确的大小(并且1个字符的字符串列表在内存方面非常昂贵) )。

如果您的内存不足,并且输入的对象是惰性求值,则此方法是最佳解决方案。


0

您也可以operator.concat()这样使用:

>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'

如果您使用的是Python 3,则需要先添加:

>>> from functools import reduce

由于内置函数reduce()已从Python 3中删除,现在位于中functools.reduce()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.