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

ran*_*guy 40 python concatenation

鉴于这个无害的小清单:

>>> lst = ['o','s','s','a','m','a']
Run Code Online (Sandbox Code Playgroud)

我的目标是使用以下方法之一以pythonically方式连接小恶魔:

A.普通ol'用于完成工作的字符串函数,简短,无需导入

>>> ''.join(lst)
'ossama'
Run Code Online (Sandbox Code Playgroud)

B. lambda,lambda,lambda

>>> reduce(lambda x, y: x + y, lst)
'ossama'
Run Code Online (Sandbox Code Playgroud)

C.全球化(什么都不做,导入一切)

>>> import functools, operator
>>> functools.reduce(operator.add, lst)
'ossama'
Run Code Online (Sandbox Code Playgroud)

请建议其他pythonic方法来实现这项宽宏大量的任务.

请排名(pythonic级别)和评级解决方案给出简明的解释.

在这种情况下,最pythonic解决方案是最好的编码解决方案吗?

Sil*_*ost 60

''.join(lst)
Run Code Online (Sandbox Code Playgroud)

唯一的pythonic方式:

  • 明确(所有大男孩所做的和他们期望看到的),
  • 简单(不需要额外的进口,所有版本都稳定),
  • 快(用C语写)和
  • 简洁(在空字符串上连接iterable的元素!).

  • 虽然基于reduce的解决方案很优雅,而且我的功能程序员也很欣赏它们,但我必须同意join()确实是唯一的pythonic解决方案. (2认同)

Dan*_*ane 34

看看Guido 关于python优化的文章,它涵盖了将数字列表转换为字符串.除非您有充分的理由不这样做,否则请使用join示例.


aby*_*byx 18

当然是join.我怎么知道?让我们以一种非常愚蠢的方式来做:
如果问题只是添加2个字符串,那么你最有可能使用它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]
Run Code Online (Sandbox Code Playgroud)

哇!Python只是告诉我要用什么!:)


Eli*_*Eli 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
Run Code Online (Sandbox Code Playgroud)

  • 我打赌有办法减少pythonicity.;) (3认同)

jsb*_*eno 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
Run Code Online (Sandbox Code Playgroud)

它是内置数据类型:不需要导入 - 只需使用 - 然后你可以使用bytearray而不是列表开头 - 所以它们应该比"join"更有效,因为没有数据复制到获取bytearray的字符串表示形式.