我需要构建一个生成器,我正在寻找一种方法来缩短这个循环到一行。我尝试枚举,但是没有用。
counter=0
for element in string:
if function(element):
counter+=1
yield counter
else:
yield counter
答案 0 :(得分:6)
counter=0
for element in string:
counter+=bool(function(element))
yield counter
(是的,添加布尔值到整体的工作方式与True
1
和False
0
完全相同)。
只有bool()
可以包含function()
,True
,False
和1
以外的返回值时才需要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