【发布时间】:2011-05-27 18:33:20
【问题描述】:
如果我有一个字符列表:
a = ['a','b','c','d']
如何将其转换为单个字符串?
a = 'abcd'
【问题讨论】:
如果我有一个字符列表:
a = ['a','b','c','d']
如何将其转换为单个字符串?
a = 'abcd'
【问题讨论】:
使用空字符串的join 方法将所有字符串与中间的空字符串连接在一起,如下所示:
>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'
【讨论】:
' '.join(list) 之间加一个空格即可
"".join(['a','b','c']) 表示Join all elements of the array, separated by the string ""。同理," hi ".join(["jim", "bob", "joe"]) 会创建"jim hi bob hi joe"。
这适用于许多流行的语言,如 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是返回一个字符串,所以应该放在string类中,而不是放在list类中,所以str.join(list)方法的意思是:用str作为分隔符将list加入到一个新的字符串中(本例中为@987654329 @ 是一个空字符串)。
不知何故,一段时间后我开始喜欢这种思维方式。我可以抱怨 Python 设计中的很多事情,但不能抱怨它的连贯性。
【讨论】:
string.join() 与在许多动态语言中具有 join() 方法的大多数集合进行比较。关于可迭代对象,我想这对此类语言来说不是问题,因为将可迭代对象包含在集合构造函数中并在join() 方法中链接起来同样容易(且清晰)。
如果您的 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'。
【讨论】:
这可能是最快的方式:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
【讨论】:
''.join(['a','b','c'])
map(ord,a) 是不必要的,但加入需要 map(chr,a)。这是我的基准pastebin.com/1sKFm8ma
''.join() 更具可读性。
reduce 函数也有效
import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'
【讨论】:
(reduce + '' h) 或 (apply + h) 可以工作。但是话又说回来,在 Python 中,add 运算符正好采用 2 个操作数,因此需要 reduce。否则,您可以使用operator.add(*h),因为apply 在Python 中已被正式弃用,取而代之的是扩展调用语法(又名en.wikipedia.org/wiki/Variadic_function)
如果列表包含数字,您可以使用map() 和join()。
例如:
>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459
【讨论】:
''.join([str(i) for i in arr])其实更pythonic
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
【讨论】:
''.join(h) 将远远超过您的一对一追加方法。
reduce 的许多更奇葩的答案都是一样的。
除了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 个字符的字符串列表在内存方面非常昂贵)。
如果您的内存不足并且您有一个惰性求值的对象作为输入,那么这种方法是最好的解决方案。
【讨论】:
你也可以像这样使用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() 中。
【讨论】: