我發現了一個教程這個漂亮聲明:的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