Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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 itertools—;takewhile():多个谓词_Python_Python 3.x - Fatal编程技术网

Python itertools—;takewhile():多个谓词

Python itertools—;takewhile():多个谓词,python,python-3.x,Python,Python 3.x,假设生成器一个接一个地(从左到右)生成下面的元组 假设我想迭代,只要谓词为true。让该谓词为sum(生成的值)

假设生成器一个接一个地(从左到右)生成下面的元组

假设我想迭代,只要谓词为true。让该谓词为
sum(生成的值)<20
。然后迭代器将在
(3,5,15)
处停止。我可以这样做,比如说:

list(itertools.takewhile(lambda x: sum(x) < 20, some_generator()))
list(itertools.takewhile(lambda x:sum(x)<20,some_generator())
问题,如何用两个谓词编写类似的表达式?假设我想要:

list(itertools.takewhile(lambda x: sum(x) < 20 and first_value_of_tuple > 3, some_generator()))
list(itertools.takewhile(lambda x:sum(x)<20,元组的第一个\u值\u>3,一些\u生成器())

(在本例中,请停在
(4、6、12)

您可以使用索引访问每个元组的元素

list(itertools.takewhile(lambda x: sum(x) < 20 and x[0] > 3, some_generator()))
list(itertools.takewhile(lambda x:sum(x)<20和x[0]>3,some_generator())

如果您有其他谓词,需要访问元组的所有元素,也可以在lambda函数中解压它们:

list(itertools.takewhile(lambda (x, y, z): x+y+z < 20 and x > 3 and y < 7 and z > 1, some_generator()))
list(itertools.takewhile(lambda(x,y,z):x+y+z<20和x>3,y<7和z>1,some_generator())

这还断言所有元组的长度都为3。如果您得到一个具有4个值的元组,它将很难失败,而不是以静默方式继续。显然只在某些上下文中有用。

由于
itertools
中的所有内容都是惰性迭代的,并且您对两个谓词使用
,因此只需使用两个
takewhile
迭代器即可。有时,我发现这比将两个谓词放在一个谓词函数或lambda中更具可读性:

lessthan20 = itertools.takewhile(lambda x: sum(x) < 20, some_generator())
greaterthan3 = itertools.takewhile(lambda x: x[0] > 3, lessthan20)
list(greaterthan3)
lessthan20=itertools.takewhile(lambda x:sum(x)<20,some_generator())
greaterthan3=itertools.takewhile(λx:x[0]>3,小于20)
列表(大于3)

如果将来需要添加更多谓词,它还可以使您不必使用一个庞大的单行程序。

谢谢。有没有办法指向下一个收益率(或以前的收益率)呢?好的,除非你存储了该值,否则你不能回头看,但是你可以使用下一个收益率向前看,更多信息请参见此答案:
lessthan20 = itertools.takewhile(lambda x: sum(x) < 20, some_generator())
greaterthan3 = itertools.takewhile(lambda x: x[0] > 3, lessthan20)
list(greaterthan3)