将字符串添加到另一个字符

时间:2010-06-16 14:30:20

标签: python string

我目前遇到了一个问题: 我想处理非常有效地将字符串添加到其他字符串,所以我查找了许多方法和技术,并且我想出了“最快”的方法。 但我完全不明白它是如何运作的:

def method6():
    return ''.join([`num` for num in xrange(loop_count)])

来自source (Method 6)

特别是([`num` for num in xrange(loop_count)])完全迷惑了我。

4 个答案:

答案 0 :(得分:6)

它是list comprehension,使用反引号进行repr转换。不要这样做。在py3k中不推荐使用反引号并删除反引号,更高效和pythonic方式根本不是构建中间列表,而是使用生成器表达式:

''.join(str(num) for num in xrange(loop_count))        # use range in py3k

答案 1 :(得分:2)

括号中的这一位是列表理解,可以说是Python中最强大的元素之一。它从迭代中生成一个列表。您可能想查找其文档。使用反引号将num转换为字符串是不可取的 - 尝试使用str(num)或其他一些代替。

join()是字符串类的方法。它接受一个字符串列表并返回一个字符串,该字符串由每个由“self”(也称为调用字符串)分隔的组件字符串组成。这里的技巧是直接从字符串文字''调用join(),这在Python中是允许的。这段代码将产生一个字符串,该字符串由xrange(loop_count)的每个元素的字符串形式组成,没有分离。

答案 2 :(得分:2)

xrange()是range()的更快(用C语言编写)版本。

反引号表示法 - num,将变量强制转换为字符串,与str(num)相同。

[x表示y]中的x被称为列表推导,基本上是一个单行循环,它返回一个列表作为结果。总而言之,您的代码在语义上等同于以下内容,但更快,因为列表推导和xrange比for循环和range更快:

z = []
for i in range(loop_count):
   z.append(str(i))
return "".join(z)

答案 3 :(得分:1)

首先:虽然这段代码在2.x系列的Python中仍然是正确的,但它有点混乱,可以用不同的方式编写:

def method6a():
    return ''.join(str(num) for num in xrange(loop_count))

在Python 2.x中,可以使用反引号代替repr函数。方括号[]内的表达式是列表理解。如果您不熟悉列表推导:它们的工作方式类似于循环和列表追加语句的组合,只是您不必为变量创建名称:

这两个是等价的:

a = [repr(num) for num in xrange(loop_count)]
# <=>
a = []
for num in xrange(loop_count):
    a.append(repr(num))

因此,列表推导将包含从0到loop_count(独占)的所有数字的列表。

最后,string.join(iterable)将使用string的内容连接iterable中的所有字符串,使用string作为每个元素之间的分隔符。如果你使用空字符串作为分隔符,那么所有元素之间都没有任何连接 - 这正是你想要的:从0到loop_count的所有数字的串联。

至于我的修改:

  • 我使用str代替repr,因为所有整数的结果都相同,而且更容易阅读。
  • 我使用generator expression而不是列表理解,因为列表推导构建的列表是不必要的,无论如何都会收集垃圾。生成器表达式是可迭代的,但它们不需要存储列表的所有元素。当然,如果您已经有一个字符串列表,那么只需将列表传递给连接。

通常,大多数Python程序员都很好地理解'.join(可迭代)习语是指“任何字符串列表的字符串连接”,因此可理解性应该不是问题。