2012-07-15 42 views
2

無論我嘗試什麼,我似乎都無法使我的大腦發生這種情況,但必須有一種方法來映射發生器函數。迭代兩個不同長度的發生器,一個纏繞在一起

例如,如果我想將列表[1,2,3,4,5,6,7,8,9,10]中的每個成員與列表[1,2, 3]打完[1,2,3]列表用完將重啓:

[1 2 3 4 5 6 7 8 9 10] 

x [1 2 3 1 2 3 1 2 3 1 ] 
------------------------------------ 
    [1 4 9 4 10 18 7 16 27 10] 

你會怎麼做這個給你不知道的[1,2,3,4的長度, 5,6,7,8,9,10]列表?

回答

14

itertools module是你的朋友。這樣做的一個方法是在第二列表中使用itertools.cycle循環:

>>> import itertools 
>>> a = range(1, 11) 
>>> a 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> b = itertools.cycle([1,2,3]) 
>>> b 
<itertools.cycle object at 0x1004be830> 
>>> ans = [i*j for i,j in zip(a,b)] 
>>> ans 
[1, 4, 9, 4, 10, 18, 7, 16, 27, 10] 

這需要的事實zip停止繪製條件時a用完的優勢。

+0

傑出放! :) – 2012-07-15 23:03:33

+0

@ValentineBondar:如果這解決了您的問題,請單擊左側的複選標記以接受此答案。 – 2012-07-16 19:33:03

+3

列表理解的替代方法是'itertools.imap()'和'operator.mul()':'imap(mul,a,cycle([1,2,3]))''。 – 2012-07-16 19:36:01

1

如果您有隨機存取比重複第一個列表並通過第一個索引訪問其他元素模其他列表的長度。

如果你只能迭代,迭代第一個,並有第二個迭代器,你每次遇到第二個列表結束時重新開始。

如果真的需要使用生成器來完成,那麼需要兩個:外部產生第一個列表元素的產品與第二個產生器的值,產生第二個列表值並在其末尾重新開始。

+0

你能給我簡單的例子在每種類型的代碼嗎?我仍然是python的新手,不能很容易地想象它... – 2012-07-15 21:28:01

+0

對不起,你沒有用Python標記標記你的問題。所以我認爲這是一個更一般的編程問題。我的Python體驗是一種前所未有的方式。考慮用python標籤重新標記你的問題,我確定有人會幫忙。 – Arne 2012-07-15 21:44:04