大多数Pythonic连接字符串的方法

时间:2010-01-25 16:04:37

标签: python concatenation

鉴于这个无害的小清单:

>>> 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解决方案是最好的编码解决方案吗?

6 个答案:

答案 0 :(得分:58)

''.join(lst)

唯一的pythonic方式:

  • 清楚(所有大男孩都做了什么,他们期望看到什么),
  • 简单(无需额外导入,所有版本都稳定),
  • fast(用C语言写成)和
  • 简洁(在空字符串上连接可迭代的元素!)。

答案 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或其他类似的数组专用函数)