2012-04-15 23 views
2

我有這些列表:迴路在兩個列表

list1 = [3, 5, 2, 1, 9] 
list2 = [6, 9, 1, 2, 4] 
list3 = [] 
list4 = [] 

和我想通過這些式:

x = a/b 
y = 1/b 

其中a是在list1的和b的每一個值是在list2中的每一個值和將計算結果附加到兩個空列表中 - list3和list4。

這是我有,但它是一個災難哈哈:(

u = 0 
while u<len(list1): 
    for a in list1: 
     for b in list2: 
      x = a/b 
      y = 1/b 
      u+=1 
      list3.append(x,) 
      list4.append(y,) 

任何人都可以幫我嗎?

+0

你想遍歷列表並行或以上元素的每個組合:它可以通過使用generator expression代替list comprehension進行更高效的內存? – Philipp 2012-04-15 21:20:21

+0

@ Philipp平行。 – DarsAE 2012-04-15 21:26:13

+0

好的,那麼下面的答案是正確的:) – Philipp 2012-04-15 21:26:42

回答

5

這裏是一個oneliner:

>>> list3,list4 = zip(*[(a/b,1/b) for a,b in zip(list1,list2)]) 
>>> list3 
(0, 0, 2, 0, 2) 
>>> list4 
(0, 0, 1, 0, 0) 

輸出是tuples。但他們可以很容易地轉換爲list

哦。

>>> zip(*((a/b,1/b) for a,b in zip(list1,list2))) 
+0

好戲。它總是更好避免追加考慮它是昂貴的。 – Abhijit 2012-04-15 21:27:02

+0

@Ahhijit你是對的。列表附加效率不高(因爲經常需要內存分配)。 – ovgolovin 2012-04-15 21:28:28

+0

謝謝!我正在使用這段代碼,並將元組轉換爲列表。謝謝大家誰也回答了! – DarsAE 2012-04-15 21:32:48

4
for a, b in zip(list1, list2): 
    x = a/b 
    y = 1/b 
    list3.append(x) 
    list4.append(y) 

這是假設你的意思是你想使用的成對列表。明智相反,如果你的意思是你想要的清單中每一個可能的配對,然後:

for a in list1: 
    for b in list2: 
     x = a/b 
     y = 1/b 
     list3.append(x) 
     list4.append(y) 
4
for a,b in zip(list1,list2): 
    x = a/b 
    y = 1/b 

??像這樣

4

只需使用壓縮功能的Python:

for a, b in zip(list1, list2): 
    list3.append(a/b) 
    list4.append(1/b) 
+0

你的答案與@NedBatchelder最初給出的答案完全相同 – Tadeck 2012-04-15 21:20:27

+5

@Tadeck:當一個問題可以在幾秒內回答時,總是發生這種情況。因爲答案是正確的,所以不需要冷靜下來。 – Philipp 2012-04-15 21:21:42

+0

在間隔幾秒鐘的時間內,我猜這個問題在解決方案很少的時候會有相同的解決方案。 – 2012-04-15 21:22:40