基本上,我想建立一个列表理解两个迭代器的“笛卡尔乘积”。想想以下Haskell code:在Python中,是否有一个简洁的方式来使用列表理解与多个迭代器?
[(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 code:在Python中,是否有一个简洁的方式来使用列表理解与多个迭代器?
[(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) ]
这似乎做你的描述:
[A,B]的范围内(1,3)为b在范围(1,5)]
更新:讨厌鬼!在发布之前,应该重新加载页面以查看S.Lott的答案。嗯......如何做一点点增值?也许是对Python交互模式有用性的一个简短证明。
我最近来自Perl的背景,所以遇到这样的问题时,我发现在命令行键入“python”并进入交互模式非常有帮助,并且只需a)开始尝试,并且b)通过点击向上箭头和调整我以前的尝试,直到我得到我想要的。任何时候我对某些关键字都很朦胧,帮助就在眼前。只需输入:help(“some_keyword”),阅读摘要,然后点击“Q”,我就可以直接与python解释器交谈了。
建议如果你是初学者而不使用它。
笛卡尔积在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)]
有关嵌套理解有趣的事实:它模仿嵌套“for”循环,所以内部的人可以从外部的使用价值。这在笛卡尔产品案例中没有用处,但很好理解。例如:
[ (i,j) for i in range(10) for j in range(i) ]
生成所有对(i,j)
其中0>=i>j>10
。
是的,先生,我正在问。我不知道是否有可能以及使用什么语法,谢谢。 – 2008-12-01 03:06:44
甜!我完全错过了这个功能。 – 2008-12-01 09:49:30