Answers:
使用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返回的是字符串,因此应将其放置在字符串类中,而不是列表类中,因此该str.join(list)
方法意味着:使用str
分隔符将列表连接到新字符串中(本例中str
为空字符串)。
过了一段时间,我莫名其妙地爱上了这种思维方式。我可以抱怨Python设计中的很多事情,但不能抱怨它的连贯性。
string.join()
与大多数使用join()
多种动态语言的方法进行比较。关于可迭代对象,我想对于此类语言来说这不是问题,因为将可迭代对象封装在集合构造函数中并在join()
方法中进行链接同样容易(而且清晰易懂)。
这可能是最快的方法:
>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'
''.join(['a','b','c'])
map(ord,a)
是不必要的,但需要join map(chr,a)
。这是我的基准pastebin.com/1sKFm8ma
''.join()
易读得多。
减少功能也起作用
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)
h = ['a','b','c','d','e','f']
g = ''
for f in h:
g = g + f
>>> g
'abcdef'
''.join(h)
将远远超过您的一对一追加方法。
除了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个字符的字符串列表在内存方面非常昂贵) )。
如果您的内存不足,并且输入的对象是惰性求值,则此方法是最佳解决方案。
您也可以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()
。