我正在尝试熟悉itertools。作为练习,我想生成(X,Y)整数对满足-1 <ý< X < 5.使用itertools下面的代码产生不正确的结果:在lambda函数中使用参数
from itertools import *
xs = xrange(0,5)
allPairs = chain(*(izip(repeat(x), takewhile(lambda y: y < x, count())) for x in xs))
print list(allPairs)
输出是
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]
问题似乎是,taketime中的lambda函数使用x = 4,即范围内的最大值。
如果我修改上面的代码,为每个x显式构造一个lambda函数,如下所示,输出正确计算。
from itertools import *
xs = xrange(0,5)
xypair = lambda x: izip(repeat(x), takewhile(lambda y: y < x, count()))
allPairs = chain(*(xypair(x) for x in xs))
print list(allPairs)
输出:
[(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2), (4, 3)]
为什么在第一个代码拉姆达只使用构造迭代过XS的最后价值的想法?
您指出的答案的相关问题谢谢。 – StackExchangeFan 2014-11-09 01:46:03