在Python中,是否有一种使用多个迭代器的列表理解的简明方法?

时间:2008-12-01 02:44:03

标签: python iterator list-comprehension

基本上,我想建立一个对两个迭代器的“笛卡尔积”的列表理解。考虑以下Haskell code

[(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 个答案:

答案 0 :(得分:17)

你在问这个吗?

[ (i,j) for i in range(1,3) for j in range(1,5) ]

答案 1 :(得分:7)

笛卡儿积在itertools module(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)]

答案 2 :(得分:5)

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

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

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

答案 3 :(得分:2)

这似乎符合您的描述:

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

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

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

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

相关问题