2015-09-19 35 views
0

轉變,我有兩個列表:元素以元素相乘,並通過一個

a = [[A,1],[B,2],[C,3]] 
b = [[X,4],[Y,5],[Z,6]] 

我想乘元素以這樣的方式元素,我保持「一」,因爲它是由一個轉向「B」在每次迭代中的位置。

1st iteration: 
1*4+2*5+3*6 = 32 
2nd iteration: 
1*5+2*6+3*4 = 29 
3rd iteration: 
1*6+2*4+3*5 = 29 

將所有結果存儲在列表c中。我期望c是:

c = [32,39,29] 

任何人都可以請幫助我這個。

+1

它可能是有意義的使用'集合.deque'代表'b'代替列表 – Pynchia

回答

3

一種簡單的方式來做到這一點是使用切片:

c = [] 
for i in range(len(b)): 
    c.append(sum(x*y for x, y in zip(a, b[i:] + b[:i]))) 

採樣運行:

In [1]: a = [1, 2, 3] 
    ...: b = [4, 5, 6] 
    ...: 

In [2]: c = [] 
    ...: for i in range(len(b)): 
    ...:  c.append(sum(x*y for x, y in zip(a, b[i:] + b[:i]))) 
    ...:  

In [3]: c 
Out[3]: [32, 29, 29] 

在你的情況,你可能需要通過x[1]*y[1]更換x*y

但是,這會在每次迭代時創建一個b的副本。你可能想簡單地使用循環:

import itertools as it 

c = [] 
for k in range(len(b)): 
    res = 0 
    for i, j in enumerate(it.chain(range(k, len(b)), range(k))): 
     res += a[i]*b[j] 
    c.append(res) 

或者你可以使用一個collections.deque存儲指數:

from collections import deque 

c = [] 
b_indices = deque(range(len(b))) 

for _ in range(len(a)): 
    c.append(sum(x*b[j] for x, j in zip(a, b_indices)) 
    b_indices.rotate(-1) 
0

您可以使用此解決方案。這是在每次迭代中修改b。

lst =[] 
for i in range(len(a)): 
    value= [a[i][1]*b[i][1] for i in range(len(b))] 
    lst.append(sum(value)) 
    b.insert(0,b.pop()) 
print lst 

輸出:

[32,29,29] 

對於像您期望的完整的解決方案,請參閱本:

lst =[] 
summed =0 
length =len(a) 
for x in range(len(a)): 
    print "Iteration ",x+1 
    for i in range(length): 
     print a[i][1],"*",b[i][1], 
     summed +=a[i][1]*b[i][1] 
     if i<length-1: 
      print "+", 

     else: 
      print "=", summed 
      lst.append(summed) 
      summed=0 
    b.insert(0,b.pop()) 

print lst 

輸出:

Iteration 1 
1 * 4 + 2 * 5 + 3 * 6 = 32 
Iteration 2 
1 * 6 + 2 * 4 + 3 * 5 = 29 
Iteration 3 
1 * 5 + 2 * 6 + 3 * 4 = 29 
[32, 29, 29] 
+0

我在哪裏可以顯示單個乘法元素?例如。 1 * 4 2 * 5 3 * 6 –

+0

然後您必須遍歷列表。 –

+0

我想在計算總和之前顯示1 * 4,2 * 5,3 * 6。你能告訴我如何? –