2011-09-02 34 views
3

我发现了一个教程这个漂亮声明:的Python中横过两个列表

for x,y in [(x,y) for x in listA for y in listB]: 

现在,对我来说,我理解,这statment将穿越listA的和数组listB x是列表A和y的值是listB的值。但在这个例子中,两个列表的长度相同。如果一个列表比另一个列表长,或者我必须使用不同的语句,这个语句是否也给了我所有的对?

在此先感谢。

+0

输出为什么不给呢? – kravemir

+6

老兄,只需在python中输入内容即可轻松回答。如果你想学Python,你真的需要使用它。我并不是在批评你提出一个问题,只是说你应该交互地使用python(在提示符下,而不是编写程序) - 这是一种有用的技巧,你可以通过快速实验为自己节省大量时间。 –

+0

我发现这个句法恐怖中的“很好”。正如你刚刚从@phihags发现的那样:你没有理解这行代表什么。仅仅因为编译的东西不能正确编码 - 这不易读,因此违背了Python的主要原则之一。 – immortal

回答

13

代码按照您的建议计算笛卡尔积(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) 
+1

OP可能仍在寻找:http://docs.python.org/library/itertools.html#itertools.izip_longest –

+0

所以会有真正的所有可能的配对,即使当一个列表的元素多于另一个列表时编辑:啊,现在我看到了这个例子。谢谢 – markus

+0

@markus:好吧,如果你得到所有的组合,那么长度并不重要。 –

6

的例子会产生listAlistB所有项目的所有组合。把它想象成书写

for x in listA: 
    for y in listB: 
     … 
0

我喜欢为遍历两个列表添加一个答案在同一时间。

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