基本上,我想在两个迭代器的“笛卡尔积”上建立一个列表理解。想想下面的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 中获得类似的行为吗?
基本上,我想在两个迭代器的“笛卡尔积”上建立一个列表理解。想想下面的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 中获得类似的行为吗?
你是在问这个吗?
[ (i,j) for i in range(1,3) for j in range(1,5) ]
笛卡尔积在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)]
关于嵌套理解的有趣事实:它模仿嵌套的“for”循环,因此内部循环可以使用外部循环的值。这在笛卡尔积中没有用,但很高兴知道。例如:
[ (i,j) for i in range(10) for j in range(i) ]
生成所有对(i,j)
其中0>=i>j>10
.
这似乎符合您的描述:
[[a,b] 对于范围内的 a (1,3) 对于范围内的 b (1,5)]
更新:德拉特!应该在发布之前重新加载页面以查看 S.Lott 的答案。嗯……怎么做一点增值?也许是对 Python 交互模式有用性的简短证明。
我最近来自 Perl 的背景,所以对于这样的问题,我发现在命令行中键入“python”并进入交互模式非常有帮助,然后 a) 开始尝试,b) 通过点击来完善细节-箭头并调整我之前的尝试,直到我得到我想要的。每当我对某个关键字感到模糊时,帮助就在眼前。只需输入:help("some_keyword"),阅读简短摘要,然后点击“Q”,我就可以与 python 解释器直接对话。
如果您是初学者并且不使用它,建议您使用它。