鉴于这个无害的小清单:
>>> lst = ['o','s','s','a','m','a']
我的目标是使用以下方法之一以pythonically方式连接小恶魔:
一个。普通ol'用于完成工作的字符串函数,简短,无需导入
>>> ''.join(lst)
'ossama'
B中。 lambda,lambda,lambda
>>> reduce(lambda x, y: x + y, lst)
'ossama'
℃。全球化(什么都不做,导入一切)
>>> import functools, operator
>>> functools.reduce(operator.add, lst)
'ossama'
请建议其他pythonic方法来实现这项宽宏大量的任务。
请排名(pythonic级别)并给出简明解释的评分解决方案。
在这种情况下,最pythonic解决方案是最好的编码解决方案吗?
答案 0 :(得分:58)
''.join(lst)
唯一的pythonic方式:
答案 1 :(得分:33)
在python优化中查看Guido的essay,它包括将数字列表转换为字符串。除非您有好的原因,否则请使用join
示例。
答案 2 :(得分:18)
当然是join
。我怎么知道?让我们以一种非常愚蠢的方式做到这一点:
如果问题只是添加了两个字符串,那么您最有可能使用str1 + str2
。如何才能达到新的水平?本能地,对于大多数人(我认为),将使用sum
。让我们看看这是怎么回事:
In [1]: example = ['a', 'b', 'c']
In [2]: sum(example, '')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython console> in <module>()
TypeError: sum() can't sum strings [use ''.join(seq) instead]
哇! Python只是告诉我要用什么! :)
答案 3 :(得分:7)
这是最少的Pythonic方式:
out = ""
for x in range(len(lst)):
for y in range(len(lst)):
if x + y == len(lst)-1:
out = lst[y] + out
答案 4 :(得分:6)
我自己使用“join”方式,但是从python 2.6开始,有一种很少使用的基类型: bytearray 。
Bytearrays可能非常有用 - 对于包含文本的字符串,因为最好的事情是在unicode中,“join”方式是要走的路 - 但如果你正在处理二进制数据,则bytearrays可以更加pythonic和更高效:
>>> lst = ['o','s','s','a','m','a']
>>> a = bytearray(lst)
>>> a
bytearray(b'ossama')
>>> print a
ossama
它是内置数据类型:不需要导入 - 只需使用 - 然后你可以使用bytearray而不是列表开头 - 因此它们应该比“join”更有效,因为没有数据复制以获取bytearray的字符串表示。
答案 5 :(得分:4)
SilenGhost给出了很好的回答,但只是关于所呈现的reduce
“替代”的几句话
除非你有一个非常非常良好的理由使用+
或operator.add
连接字符串(最常见的一个,你很少,修复了)字符串数量),您应该始终使用join
。
只是因为每个+
生成一个新字符串,它是两个字符串的串联,除非只生成一个最终字符串的连接。所以,想象你有3个字符串:
A + B + C
-->
D = A + B
final = D + C
好吧,似乎并不多,但你必须为D保留内存。另外,由于python使用字符串,生成一个新的,中间的字符串,它有点贵......
现在,有5个字符串
A + B + C + D + E
-->
F = A + B
G = F + C
H = G + D
final = H + E
假设最好的场景(如果我们做(A + B)+(C + D)+ E,我们将在内存上同时结束三个中间字符串),那就是生成3个中间字符串......你必须生成一个新的python对象,保留内存空间,释放内存几次......还有调用Python函数的开销(这不小)
现在用200个字符串来思考它。我们最终会得到一个荒谬的大量中间字符串,每个中间字符串消耗相当多的时间在一个完整的python列表上,并调用很多operator.add
函数,每个函数都有其开销......即使您使用reduce
函数,它也无济于事。这是一个必须使用不同方法管理的问题:join
,它只生成 ONE 完整的python字符串,最后一个并调用ONE python函数。
(当然,join
或其他类似的数组专用函数)