2011-09-02 37 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