有没有办法缩短这个Python生成器表达式?

时间:2013-04-30 23:16:06

标签: python list for-loop generator list-comprehension

我需要构建一个生成器,我正在寻找一种方法来缩短这个循环到一行。我尝试枚举,但是没有用。

counter=0
for element in string:
    if function(element):
        counter+=1
        yield counter
    else:
        yield counter

4 个答案:

答案 0 :(得分:6)

counter=0
for element in string:
    counter+=bool(function(element))
    yield counter

(是的,添加布尔值到整体的工作方式与True 1False 0完全相同)。

只有bool()可以包含function()TrueFalse1以外的返回值时才需要0来电。

答案 1 :(得分:4)

如果您使用的是Python 3,则可以执行以下操作:

from itertools import accumulate

yield from accumulate(1 if function(x) else 0 for x in string)

虽然我使用Simeon Visser's answer。虽然这可能很短,但目前还不清楚代码的作用。

答案 2 :(得分:4)

首先,您可以将字符串转换为function返回值的迭代器:

truths = (function(x) for x in string)

然后你可以将它们映射到0和1:

onesandzeroes = (1 if function(x) else 0 for x in string)

然后accumulate他们:

running = itertools.accumulate(1 if function(x) else 0 for x in string)

正如文档所述,在Python 3.2中添加了accumulate。如果您使用的是2.x,则可以从文档中复制并粘贴“等效于”配方。 (如果你使用3.0-3.1,你也可以这样做,但在这种情况下,只需升级。)

答案 3 :(得分:3)

您可以将其缩短为:

counter=0
for element in string:
    if function(element):
        counter+=1
    yield counter