关于python:将字符列表转换为字符串

Convert a list of characters into a string

如果我有字符列表:

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

如何将其转换为单个字符串?

1
a = 'abcd'


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

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


这在JavaScript或Ruby中有效,为什么不在Python中有效呢?

1
2
3
4
>>> ['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类上:

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

有点奇怪,不是吗?为什么join不是list对象中的方法,就像在javascript或其他流行的脚本语言中一样?这是Python社区如何思考的一个例子。因为join返回一个字符串,所以它应该放在string类中,而不是列表类中,所以str.join(list)方法意味着:使用str作为分隔符将列表加入到一个新的字符串中(在这种情况下,str是一个空字符串)。

不知怎么的,过了一会儿我就爱上了这种思维方式。在Python设计中,我可以抱怨很多事情,但不能抱怨它的一致性。


如果您的python解释器是旧的(例如,1.5.2,这在一些旧的Linux发行版上很常见),那么您可能没有可用的join()作为任何旧字符串对象的方法,而您将需要使用字符串模块。例子:

1
2
3
4
5
6
7
8
a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

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

字符串b将是'abcd'


这可能是最快的方法:

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


reduce功能也起作用

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


使用带空分离器的join

1
2
h = ['a','b','c','d','e','f']
print ''.join(h)

或使用reduceadd运算符

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


1
2
3
4
5
6
7
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'


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

如:

1
2
3
4
    arr = [3, 30, 34, 5, 9]
    ''.join(map(str,arr))

>> 3303459


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

1
2
3
4
5
6
7
import io

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

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

印刷品:

1
abcd

当将此方法用于生成器函数或不属于tuplelist的iterable时,它节省了join所做的临时列表创建,一次即可分配正确的大小(1个字符字符串的列表在内存方面非常昂贵)。

如果您的内存不足,并且有一个延迟计算的对象作为输入,那么这种方法是最好的解决方案。


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

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

如果您使用的是python 3,则需要预先准备:

1
>>> from functools import reduce

由于内置的reduce()已从python 3中删除,现在位于functools.reduce()


1
2
3
4
    str = ''
    for letter in a:
        str += letter
    print str


1
2
3
4
5
g = ['a', 'b', 'c', 'd']
f=''
for i in range(0,len(g)):
    f=f+g[i]
print f