2015-10-14 79 views
1

所以我有以下列表:倍列表的列表產生列表

cd = [[0.1,0.2,0.1,0.9], [0.2, 0.3, 0.4, 0.1],[0.2,0.3,0.1,0.5] 

,我想獲得的嵌套列表以列表格式的單個元素的產品。 ..

所以我打算爲:

p = [(0.1*0.2*0.2),(0.2*0.3*0.3),(0.1*0.4*0.1),(0.9*0.1*0.5)] 

注意,這不是CD和p之間的1對1的關係。

我想這樣做只是......

在F#中,例如,我只想做list.fold,並用一個列表作爲我的累加器。是否有python等價物,或者我需要做:

p = [cd[0]] 
if len(cd) > 1: 
    for i in range(len(cd) - 1): 
     for j in range(len(p)): 
      p[j] = p[j]*cd[i+1][j] 
return p 

回答

3

你可以這樣做:

[reduce(lambda a, b: a*b, x) for x in zip(*cd)] 

This應該適用於多個列表,並且不需要任何導入。

由於@DSM提到,你還必須「導入functools」並使用「functools.reduce」作爲python3。

+0

好的!感謝,這正是我一直在尋找 – bordeo

+0

請注意,您必須導入使用Python3時從itertools減少。 –

3

您可以使用列表理解。

cd = [[0.1,0.2,0.1,0.9], [0.2, 0.3, 0.4, 0.1]] 
print [i*j for i,j in zip(cd[0],cd[1])] 

如果你只想要2位小數。

print [round(i*j,2) for i,j in zip(cd[0],cd[1])] 

如果您有多個字符串使用

cd = [[0.1,0.2,0.1,0.9], [0.2, 0.3, 0.4, 0.1],[1.0,2.0,3.0,4.0]] 
from operator import mul 
print [reduce(mul, i, 1) for i in zip(*cd)] 
+0

但如果有更多的塔,它不會工作n兩個子列表... –

+0

正確...但說cd有兩個以上的元素 – bordeo

+3

'zip(* cd)'是一個更簡潔的 –

0

您有numpy的一個通用的解決方案,有兩個以上的子列表的工作:

import numpy as np 
cd = [[0.1,0.2,0.1,0.9], [0.2, 0.3, 0.4, 0.1]] 
out = np.apply_along_axis(np.prod, 0, cd) 
+0

是啊...哦。限於我可以使用的圖書館。儘管如此,我仍會記住這一點,並將其標記爲 – bordeo

3

您可以zip結合reduce(我們可以在這裏使用lambda乘法,但由於我們正在導入無論如何,我們還不如用mul):

>>> from operator import mul 
>>> from functools import reduce 
>>> cd = [[0.1,0.2,0.1,0.9], [0.2, 0.3, 0.4, 0.1],[0.2,0.3,0.1,0.5]] 
>>> [reduce(mul, ops) for ops in zip(*cd)] 
[0.004000000000000001, 0.018, 0.004000000000000001, 0.045000000000000005] 

(Python 3裏,你不「T需要進口reduce,如果您使用的是過時的Python)

+0

TIL'map'也可用於類似ZIP:'地圖(拉姆達* Y:減少(MUL,Y),* CD)' – AChampion

+0

如果我能接受兩個答案... 感謝你們。 – bordeo

+0

我會接受這個使用'operator.mul' :)的:) – AChampion

0

嘗試:

out = [ reduce(lambda x, y: x*y, z) for z in zip(*cd) ]