簡體   English   中英

折疊列表列表以生成列表

[英]fold a list of lists to produce a list

因此,我有以下列表:

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之間的一對一關系。

我只想簡單地做...

例如,在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

您可以使用列表理解來做到這一點。

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)]

你可以這樣做:

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

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

如@DSM所述,您還必須“導入functools”並為python3使用“ functools.reduce”。

您可以將reducezip結合使用(我們可以在此處使用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;如果您使用的是過時的Python,則無需導入reduce 。)

您可以使用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) 

嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM