10

基本上,我想在两个迭代器的“笛卡尔积”上建立一个列表理解。想想下面的Haskell 代码

[(i,j) | i <- [1,2], j <- [1..4]]

产生

[(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4)]

我可以以简洁的方式在 Python 中获得类似的行为吗?

4

4 回答 4

21

你是在问这个吗?

[ (i,j) for i in range(1,3) for j in range(1,5) ]
于 2008-12-01T02:58:14.950 回答
8

笛卡尔积在itertools 模块中(在 2.6 中)。

>>> import itertools
>>> list(itertools.product(range(1, 3), range(1, 5)))
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)]
于 2008-12-01T03:40:28.347 回答
5

关于嵌套理解的有趣事实:它模仿嵌套的“for”循环,因此内部循环可以使用外部循环的值。这在笛卡尔积中没有用,但很高兴知道。例如:

[ (i,j) for i in range(10) for j in range(i) ] 

生成所有对(i,j)其中0>=i>j>10.

于 2008-12-01T09:12:21.310 回答
2

这似乎符合您的描述:

[[a,b] 对于范围内的 a (1,3) 对于范围内的 b (1,5)]

更新:德拉特!应该在发布之前重新加载页面以查看 S.Lott 的答案。嗯……怎么做一点增值?也许是对 Python 交互模式有用性的简短证明。

我最近来自 Perl 的背景,所以对于这样的问题,我发现在命令行中键入“python”并进入交互模式非常有帮助,然后 a) 开始尝试,b) 通过点击来完善细节-箭头并调整我之前的尝试,直到我得到我想要的。每当我对某个关键字感到模糊时,帮助就在眼前。只需输入:help("some_keyword"),阅读简短摘要,然后点击“Q”,我就可以与 python 解释器直接对话。

如果您是初学者并且不使用它,建议您使用它。

于 2008-12-01T03:03:33.660 回答