我发现了一个教程这个漂亮声明:的Python中横过两个列表
for x,y in [(x,y) for x in listA for y in listB]:
现在,对我来说,我理解,这statment将穿越listA的和数组listB x是列表A和y的值是listB的值。但在这个例子中,两个列表的长度相同。如果一个列表比另一个列表长,或者我必须使用不同的语句,这个语句是否也给了我所有的对?
在此先感谢。
我发现了一个教程这个漂亮声明:的Python中横过两个列表
for x,y in [(x,y) for x in listA for y in listB]:
现在,对我来说,我理解,这statment将穿越listA的和数组listB x是列表A和y的值是listB的值。但在这个例子中,两个列表的长度相同。如果一个列表比另一个列表长,或者我必须使用不同的语句,这个语句是否也给了我所有的对?
在此先感谢。
代码按照您的建议计算笛卡尔积(itertools.product
),而不是zip
。
例如,如果输入是[1,2,3]
和[4,5]
,其结果是:
(1,4)
(1,5)
(2,4)
(2,5)
(3,4)
(3,5)
为了比较,的zip([1,2,3], [4,5])
结果是:
(1,4)
(2,5)
正如你可以看到,拉链(或itertools.izip)放弃较长参数中的其他项目。
其变体itertools.izip_longest用任意值替换这些缺失的元素。例如,iterttools.izip_longest([1,2,3], [4,5], 99)
回报:
(1,4)
(2,5)
(3,99)
OP可能仍在寻找:http://docs.python.org/library/itertools.html#itertools.izip_longest –
所以会有真正的所有可能的配对,即使当一个列表的元素多于另一个列表时编辑:啊,现在我看到了这个例子。谢谢 – markus
@markus:好吧,如果你得到所有的组合,那么长度并不重要。 –
的例子会产生listA
和listB
所有项目的所有组合。把它想象成书写
for x in listA:
for y in listB:
…
我喜欢为遍历两个列表添加一个答案在同一时间。
alist = [1,2,3,4,5]
blist = [6,7,8,9,0]
for a,b in zip(alist,blist):
print a,"+",b,'=',a+b
它会给像
1 + 6 = 7
2 + 7 = 9
3 + 8 = 11
4 + 9 = 13
5 + 0 = 5
输出为什么不给呢? – kravemir
老兄,只需在python中输入内容即可轻松回答。如果你想学Python,你真的需要使用它。我并不是在批评你提出一个问题,只是说你应该交互地使用python(在提示符下,而不是编写程序) - 这是一种有用的技巧,你可以通过快速实验为自己节省大量时间。 –
我发现这个句法恐怖中的“很好”。正如你刚刚从@phihags发现的那样:你没有理解这行代表什么。仅仅因为编译的东西不能正确编码 - 这不易读,因此违背了Python的主要原则之一。 – immortal