Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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_List_For Loop_Generator_List Comprehension - Fatal编程技术网

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

有没有办法缩短这个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

我需要建立一个发电机,我正在寻找一种方法,以缩短到一条线这个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 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
was
1
False
was
0
完全相同)


只有当
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)