在takewhile中使用lambda函数中的参数

时间:2014-11-09 01:27:36

标签: python itertools

我正在尝试熟悉itertools。作为练习,我试图生成满足-1 <1的(x,y)整数对。 y&lt; x <5。使用itertools的以下代码产生不正确的结果:

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)]

问题似乎是takewhile内的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构造lambda?

1 个答案:

答案 0 :(得分:0)

尝试一些简单的事情:

  

combinations(iterable,r):r-length元组,按排序顺序,没有重复元素

>>> list(combinations(xrange(0,5),2))
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]