如果我有一个字符列表:
a = ['a','b','c','d']
如何将其转换为单个字符串?
a = 'abcd'
使用空字符串的join方法将所有字符串和中间的空字符串连接在一起,如下所示:
join
>>> a = ['a', 'b', 'c', 'd'] >>> ''.join(a) 'abcd'
这在很多流行的语言中都适用,比如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类上:
str
# this is the Python way "".join(['a','b','c','d'])
为什么join不是像JavaScript或其他流行脚本语言中的list对象中的方法?这是Python社区如何思考的一个例子。因为join返回的是一个字符串,所以它应该放在string类中,而不是list类中,所以str.join(list)方法意味着:使用str作为分隔符将列表连接到一个新的字符串中(在这种情况下,str是一个空字符串)。
list
str.join(list)
不知怎的,一段时间后,我开始喜欢上了这种思维方式。我可以抱怨Python设计中的很多东西,但不能抱怨它的连贯性。
这可能是最快的方法:
>> from array import array >> a = ['a','b','c','d'] >> array('B', map(ord,a)).tostring() 'abcd'
h = ['a','b','c','d','e','f'] g = '' for f in h: g = g + f >>> g 'abcdef'
如果你的Python解释器是旧的(例如1.5.2,这在一些旧的Linux发行版上很常见),你可能没有join()作为任何旧字符串对象的方法,你将需要使用string模块。例子:
join()
a = ['a', 'b', 'c', 'd'] try: b = ''.join(a) except AttributeError: import string b = string.join(a, '')
字符串b将是'abcd'。
b
'abcd'
reduce函数也可以工作
import operator h=['a','b','c','d'] reduce(operator.add, h) 'abcd'
你也可以像这样使用operator.concat():
operator.concat()
>>> from operator import concat >>> a = ['a', 'b', 'c', 'd'] >>> reduce(concat, a) 'abcd'
如果你使用的是python3,你需要前置:
>>> from functools import reduce
因为内置reduce()已经从Python 3中移除,现在位于functools.reduce()中。
reduce()
functools.reduce()
如果列表中包含数字,则可以使用map()和join()。
map()
例如:
>>> arr = [3, 30, 34, 5, 9] >>> ''.join(map(str, arr)) 3303459
除了最自然的方法str.join之外,还有一种可能是使用io.StringIO并滥用writelines一次性写入所有元素:
str.join
io.StringIO
writelines
import io a = ['a','b','c','d'] out = io.StringIO() out.writelines(a) print(out.getvalue())
打印:
abcd
当将这种方法用于生成器函数或非tuple或list的可迭代对象时,它会保存join所创建的临时列表,以便一次性分配正确的大小(并且一个由1个字符的字符串组成的列表非常消耗内存)。
tuple
如果内存较低,并且有一个惰性求值对象作为输入,那么这种方法是最佳解决方案。