python 具有无限项的字典的列表值的数学运算

i7uq4tfw  于 2023-02-07  发布在  Python
关注(0)|答案(4)|浏览(119)

我如何一个接一个地遍历所有键列表值,直到到达最后一个列表的数组值的末尾?所有列表对于每个键都是相同长度的。我的意思是:

my_dict1 = {'c1': [10, 11, 12], 'c2': [100, 110, 120], 'c3': [200, 210, 220]}
 my_dict2 = {'c1': 3, 'c2': 1, 'c3': 2}

我需要得到的结果是:

result = 0.5 * ([10 * 3 + 100 * 1 + 200 * 2] + [11 * 3 + 110 * 1 + 210 * 2] + [12 * 3 + 120 * 1 + 220 * 2])

我检查了Multiplying the values of dictionaries with different keysHow to Multiply list elements in dictionary,但它们在这里没有派上用场。
下面的方法只适用于两个字典有相似的键的情况。

dict1 = {2: [10, 11, 12], 2: [100, 110, 120]}
dict2 = {2: [100, 110, 120], 2: [100, 110, 120]}
result = {i :[x*y for x, y in zip(dict1[i], dict2[i])] for i in dict1.keys()}
print(result)

结果:

{2: [10000, 12100, 14400]}

我应该由NumPy或Pandas来处理它吗?在我的真实的工作中,有一个字典或数据框的键数未知。

ibrsph3r

ibrsph3r1#

你必须使用my_dict1中的键来找到my dict2中的乘数,从那里开始,你可以压缩列表并求和,它可以是一个普通的Python内联程序:

[sum(i)/2 for i in zip(*([i * my_dict2[k] for i in v] 
                         for k, v in my_dict1.items()))]

如上所示:

[265.0, 281.5, 298.0]

你也可以为同样的操作构建2个numpy数组:

arr1 = np.array(list(my_dict1.values()))
arr2 = np.array([my_dict2[k] for k in my_dict1])

然后:

np.sum(np.transpose(arr1) * arr2, axis=1)/2

按预期提供

array([265. , 281.5, 298. ])
vshtjzan

vshtjzan2#

使用zip的一种方法是:

arr = []
for k, v in my_dict1.items():
    c = my_dict2[k]
    arr.append([i * c for i in v])
    
out = [sum(a)/2 for a in zip(*arr)]

或者使用pandas

out = pd.DataFrame(my_dict1).mul(my_dict2).sum(axis=1).mul(0.5)

输出:

[265.0, 281.5, 298.0]
igetnqfo

igetnqfo3#

如果你只是想算算...

my_dict1 = {'c1': [10, 11, 12], 'c2': [100, 110, 120], 'c3': [200, 210, 220]}
my_dict2 = {'c1': 3, 'c2': 1, 'c3': 2}

result=0
for i in my_dict1:
    for j in range(len(my_dict1[i])):
        result+=my_dict1[i][j]*my_dict2[i]
result/=2
print(result)
ukxgm1gy

ukxgm1gy4#

在这里似乎使用Dataframe,Numpy和python就可以解决这个问题。正如Ballesta基于Python的回答:

[sum(i)/2 for i in zip(*([i * my_dict2[k] for i in v] 
                     for k, v in my_dict1.items()))]

使用Ballesta答案和Numpy:

arr1 = np.array(list(my_dict1.values()))
arr2 = np.array([my_dict2[k] for k in my_dict1])     
np.sum(np.transpose(arr1) * arr2, axis=1)/2

或者像克里斯回答的那样用Pandas:

out = pd.DataFrame(my_dict1).mul(my_dict2).sum(axis=1).mul(0.5)

使用DataFrame的一种更简单的方法是:

import pandas as pd

df = pd.DataFrame({'c1': [10, 11, 12], 'c2': [100, 110, 120]})
df = df.reset_index()  # make sure indexes pair with number of rows

for index, row in df.iterrows():
    print((row['c1'] + row['c2'] )/ 2)

相关问题