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