2014-11-09 131 views
0

我正在尝试熟悉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的最后价值的想法?

+0

您指出的答案的相关问题谢谢。 – StackExchangeFan 2014-11-09 01:46:03

回答

0

试试简单一点:

combinations(iterable,r):R-长度元组,在有序,没有重复的元素

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

谢谢。这个想法非常有趣。然而,我正在寻找python行为的解释来更好地理解python。 – StackExchangeFan 2014-11-09 01:46:48