Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接字符串的最具python风格的方法_Python_Concatenation - Fatal编程技术网

连接字符串的最具python风格的方法

连接字符串的最具python风格的方法,python,concatenation,Python,Concatenation,鉴于这个无害的小清单: >>> lst = ['o','s','s','a','m','a'] 我的目标是通过以下方式之一,以pythonical方式连接小恶魔: A.简单的ol'字符串函数,用于完成任务,简短,无需导入 >>> ''.join(lst) 'ossama' B.lambda,lambda,lambda >>> reduce(lambda x, y: x + y, lst) 'ossama' C.全球化(什么都不做,什么都

鉴于这个无害的小清单:

>>> lst = ['o','s','s','a','m','a']
我的目标是通过以下方式之一,以pythonical方式连接小恶魔:

A.简单的ol'字符串函数,用于完成任务,简短,无需导入

>>> ''.join(lst)
'ossama'
B.lambda,lambda,lambda

>>> reduce(lambda x, y: x + y, lst)
'ossama'
C.全球化(什么都不做,什么都导入)

请建议其他的pythonic方法来完成这个宽宏大量的任务

请对解决方案进行排名(蟒蛇级别),并给出简明的解释

在这种情况下,最具python风格的解决方案是最好的编码解决方案吗

''.join(lst)
唯一的蟒蛇方式:

out = ""
for x in range(len(lst)):
  for y in range(len(lst)):
    if x + y == len(lst)-1:
        out = lst[y] + out
  • 很清楚(所有大男孩都做了什么,他们期望看到什么)
  • 简单(无需额外导入,所有版本都稳定)
  • fast(用C编写)和
  • 简明(在空字符串上连接iterable的元素!)

看看Guido关于python优化的内容,它涵盖了将数字列表转换为字符串。除非你有很好的理由不这样做,否则请使用
join
示例。

以下是最简单的python方法:

out = ""
for x in range(len(lst)):
  for y in range(len(lst)):
    if x + y == len(lst)-1:
        out = lst[y] + out
我自己使用“join”方式,但在python 2.6中有一种基本类型很少使用:bytearray

ByteArray非常有用——对于包含文本的字符串,因为最好的方法是使用unicode,而“连接”方式是最好的选择——但是如果您处理的是二进制数据,ByteArray可以更具python风格,而且效率更高:

>>> lst = ['o','s','s','a','m','a']
>>> a = bytearray(lst)
>>> a
bytearray(b'ossama')
>>> print a
ossama

它是一种内置的数据类型:不需要导入-只需使用即可-您可以使用bytearray作为列表的开头-因此它们应该比“join”更有效,因为没有数据复制来获取bytearray的字符串表示形式。

SilenGhost的回答很好,但是,只需简单介绍一下介绍的
reduce
“备选方案”

除非您有非常非常非常的理由使用
+
运算符连接字符串。添加
(最常见的一个,即您拥有的字符串数量很少,固定),否则您应该始终使用
连接

因为每个
+
生成一个新字符串,它是两个字符串的串联,除非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,我们将在内存中同时拥有三个中间字符串),这将生成三个中间字符串。。。您必须生成一个新的python对象,保留内存空间,释放内存几次。。。还有调用Python函数的开销(这并不小)

现在用200个字符串来考虑它。我们最终将得到大量可笑的中间字符串,每一个都要花费相当多的时间在python上形成一个完整的列表,并调用大量的
操作符。添加
函数,每个函数都有其开销。。。即使使用
reduce
函数,也不会有帮助。这是一个必须用不同方法处理的问题:
join
,它只生成一个完整的python字符串,即最后一个字符串,并调用一个python函数


(当然,
join
,或其他类似的数组专用函数)

当然是
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]
[1]中的
:示例=['a','b','c']
在[2]中:总和(示例“”)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
TypeError:sum()无法对字符串求和[改用''连接(seq)]

哇!Python只是告诉了我该使用什么!:)

虽然基于reduce的解决方案很优雅,我的函数式程序员也很欣赏它们,但我必须承认join()确实是唯一的pythonic解决方案。SilentGhost是正确的。字符串有一个接受iterables的连接方法,所以使用其他任何东西都不是pythonic的。所以——大家,请检查“bytearray”原生类型(我的回答如下)。不过,Join在Python2.5之前是可以使用的。我敢打赌,在这方面有一些方法可以降低pythonicity嗯……刚刚检查过:“bytearray”构造函数甚至可以得到一个unicode字符串和一个“encoding”参数,因此它也可以处理unicode。例如:a=bytearray(u“déja vu”,encoding=“utf8”),但bytearray既不是pythonic也不是有效的。它们的用途完全不同,它们在py2.6中的行为与在py3k中的行为不同。@SilentGhost:感谢您的反馈-我在哪里可以阅读更多有关它的信息?即使它们没有一开始看起来的那么高效,我怀疑“连接”可能会更快,仅仅是因为在每个要连接的部分上创建了一个新的strign对象。(我打算今天晚些时候做一些基准测试)