2017-04-13 76 views
2

我有一個問題,比如我有名單Python - 如何計算一致數目列表中的an的乘積?

a = [1,2,3,4,5,6,7,8,9,10] 
b = [10,9,8,7,6,5,4,3,2,1] 
c = [3,4,5,6,10,4,6,7,4,3] 
d = [5,4,5,6,8,4,3,2,4,50] 

我要計算這四個列表的產品。

其實也許看起來簡單,我們只寫

e = [] 
for i in range(0, len(a)): 
    e.append(a[i] * b[i] * c[i] * d[i]) 

但問題是,如果我有一個列表中的數一致呢?有時我有1個列表,8個列表,4個列表或25個列表。我想編寫一個代碼來自動計算在同一個索引中的一致列表數目的產品。

回答

1

你可以把你列出一個更大的名單(名單列表):

super_list = [a, b, c, d] # add any more lists you want 

然後:

result = [] 
for i in xrange(0, len(a)): 
    p = 1 
    for sub_list in super_list: 
     p *= sub_list[i] 
    result.append(p) 
+0

非常感謝,但也許一個錯字「x範圍」應該是「範圍」 – riflab

+1

@ArifDarmawan的Python 2比Python 3的'xrange'適合的Python 2 – miradulo

+0

@mitch我正在使用python 3 – riflab

0

試試這個

map(lambda x: reduce(lambda y, z: y * z, x), zip(a, b, c, d)) 
1

您可以zip這些列表並使用reduce來乘以元素:

a = [1,2,3,4,5,6,7,8,9,10] 
b = [10,9,8,7,6,5,4,3,2,1] 
c = [3,4,5,6,10,4,6,7,4,3] 
d = [5,4,5,6,8,4,3,2,4,50] 

print([reduce(lambda x,y:x*y,i) for i in zip(a,b,c,d)]) 

結果:

[150, 288, 600, 1008, 2400, 480, 504, 336, 288, 1500] 

如果您使用Python3.x,你需要from functools import reduce導入reduce方法。

0

您可以編寫一個函數,該函數可以用任意數量的參數重載並使用該參數進行乘法運算。例如:

def list_product(*args): 
    if len(args) == 0: #need at least one argument! 
    return [] 
    arg_length = len(args[0]) 
    for arg in args: #make sure all arrays have the same length 
    if arg_length != len(arg): 
     return [] 

    out = [] 
    for i in range(0, arg_length): 
    temp = 1 
    for arr in args: 
     temp *= arr[i] 
    out.append(temp) 
    return out 

print(list_product([1,2,3],[4,5,6])) 
# [4, 10, 18] 

這具有可重複使用的優點。看起來你可能想在各種各樣的陣列中使用它。一旦你有這個功能,很容易與其他數組一起使用。

a = [1,2,3,4] 
b = [4,5,6,7] 
c = [1,2,2,1] 
list_product(a,b,c) # gives [4,20,36,28] 
0

使用*args參數機制來收集所有列表到所有列表中的一個元組:

def product_of_lists(*args): 

    result = [] 

現在你有一個方法來調用一個函數來做到你想做的。

接下來,使用zip輪流遍歷每個列表中的每個值。也就是說,zip(a,b,c)將產生的元組(A [0],B [0],C [0]),那麼另一元組(一1,B 1,C 1)等

for t in zip(*args): 

在這種情況下使用*args將args的元組變成一堆單獨的參數,就好像你寫了zip(args[0], args[1], ...)一樣。

在這一點上,t是一個你需要乘法的元組。

您可以使用functools.reduce應用跨一個迭代累計值的函數(和元組是iterables!)。像這樣:

functools.reduce(lambda a,b: calc(a,b), t) 

這將拉姆達適用於每對值:(T [0],T 1),然後(結果-的-以前,T [n])的等

所以,你的情況,你可以編寫自己的lambda函數做乘法:

 r = functools.reduce(lambda a,b: a*b, t) 

或者,你可以導入操作,並使用operator.mul功能,這正是這一點:

 r = functools.reduce(operator.mul, t) 

然後捕獲的結果:

 result.append(r) 

    return result 

全部放在一起:

import functools 

def product_of_lists(*args): 
    result = [] 
    for t in zip(*args): 
     r = functools.reduce(lambda a,b: a*b, t) 
     result.append(r) 
    return result 
0

使用Python 3,定義產品功能(在許多情況下是有用的):

def rp(seq): 
    return 1 if len(seq)==0 else seq[0]*rp(seq[1:]) 

然後直接計算結果

result = [rp(x) for x in zip(a,b,c,d)] 

或使用列表的列表:

super_list = [a,b,c,d] 
result = [rp(x) for x in zip(*super_list)] 
相關問題