有没有办法缩短这个Python生成器表达式?
我需要建立一个发电机,我正在寻找一种方法,以缩短到一条线这个for循环。我试着列举,但没用有没有办法缩短这个Python生成器表达式?,python,list,for-loop,generator,list-comprehension,Python,List,For Loop,Generator,List Comprehension,我需要建立一个发电机,我正在寻找一种方法,以缩短到一条线这个for循环。我试着列举,但没用 counter=0 for element in string: if function(element): counter+=1 yield counter else: yield counter 如果您使用的是Python 3,则可以执行以下操作: from itertools import accumulate yield from
counter=0
for element in string:
if function(element):
counter+=1
yield counter
else:
yield counter
如果您使用的是Python 3,则可以执行以下操作:
from itertools import accumulate
yield from accumulate(1 if function(x) else 0 for x in string)
虽然我会用。虽然这段代码可能很短,但目前还不清楚代码的作用。您可以将其缩短为:
counter=0
for element in string:
if function(element):
counter+=1
yield counter
(是的,向ints添加布尔值的工作原理与True
was1
和False
was0
完全相同)
只有当
function()
可以具有除True
、False
、1
和0
以外的返回值时,bool()
调用才是必需的。首先,可以将字符串转换为函数的迭代器
返回值:
truths = (function(x) for x in string)
然后您可以将这些映射到0和1:
onesandzeroes = (1 if function(x) else 0 for x in string)
然后他们:
如文档所述,
acculate
是在Python 3.2中添加的。如果您使用的是2.x,您可以从文档中复制并粘贴“等效于”配方。(如果您使用的是3.0-3.1,您也可以这样做,但实际上,在这种情况下,只需升级即可。)您是否缺少一个计数器=0
,或者这应该是外部代码中任何计数器的闭包?Python的哪个版本?不,我最初排除了它,但我只是包含了它。我需要保持运行计数,因此,我也需要使用else语句进行让步。@garlfd:这仍然会对字符串中的每个元素进行让步,它只会对某些元素进行更新。@jamylak:最后不会留下一个计数器变量。除非函数显式返回0和1,否则这将无法工作。如果它返回,比如说,None
或一个字符串,您将得到TypeError
s。即使它返回True
和False
,第一个值将是False
,而不是0
。我不确定“我假设累加
返回布尔值”是什么意思。它返回一个迭代器。它是一个迭代器,它覆盖你给它的任何可添加类型(或者,更确切地说,覆盖你给它的任何类型的添加结果,因为,例如,False+True==1
,或者,在旧的Python中,(1@abarnert:抱歉,累计
应该是函数
@Blender:那么它仍然是错误的,因为正如我前面解释的,您产生的第一个值将是假
,而不是0
。
onesandzeroes = (1 if function(x) else 0 for x in string)
running = itertools.accumulate(1 if function(x) else 0 for x in string)