繁体   English   中英

基于另一个列表的 Python dict 的按元素值求和

[英]SUM element-wise values of Python dict based on another list

我有一本字典和一个清单

mylist=[('B',), ('D',), ('B', 'D'), ('B', 'J'), ('B', 'P'), ('B', 'M'), ('D', 'J'), ('D', 'P'), ('D', 'M'), ('J', 'P'), ('J', 'M'), ('P', 'M'), ('B', 'D', 'J'), ('B', 'D', 'P'), ('B', 'D', 'M')]

dict={'B': [1, 0, 1, 1], 'D': [1, 1, 0, 1], 'J': [0, 0, 1, 1], 'P': [1, 1, 0, 1], 'M': [1, 0, 0, 1]}

我想做的是根据列表总结字典值。 我的代码是:

myresult=[]
for k,v in dict.items():
        row=sum(v for k, v in dict.items() if k in mylist) 
        myresult.append(row)

我得到的是[0,0,0,0,0]

预期的结果是根据 mylist 对字典中的各个项目求和并返回类似

[(1,0,1,1), (1,1,0,1), (2,1,1,2), xxxx]

有人可以帮忙吗?

mylist=[('B',), ('D',), ('B', 'D'), ('B', 'J'), ('B', 'P'), ('B', 'M'), ('D', 'J'), ('D', 'P'), ('D', 'M'), ('J', 'P'), ('J', 'M'), ('P', 'M'), ('B', 'D', 'J'), ('B', 'D', 'P'), ('B', 'D', 'M')]

# change dict to dict_map
dict_map={'B': [1, 0, 1, 1], 'D': [1, 1, 0, 1], 'J': [0, 0, 1, 1], 'P': [1, 1, 0, 1], 'M': [1, 0, 0, 1]}

myresult = []
for item in mylist:
    arrays = [dict_map.get(i) for i in item]
    sum_list = [sum(x) for x in zip(*arrays)]
    myresult.append(sum_list)
    print(sum_list)
    

结果:

[1, 0, 1, 1]
[1, 1, 0, 1]
[2, 1, 1, 2]
[1, 0, 2, 2]
[2, 1, 1, 2]
[2, 0, 1, 2]
[1, 1, 1, 2]
[2, 2, 0, 2]
[2, 1, 0, 2]
[1, 1, 1, 2]
[1, 0, 1, 2]
[2, 1, 0, 2]
[2, 1, 2, 3]
[3, 2, 1, 3]
[3, 1, 1, 3]

使用函数式编程的一种方法:

from functools import reduce

my_list = [('B',), ('D',), ('B', 'D'), ('B', 'J'), ('B', 'P'), ('B', 'M'), ('D', 'J'), ('D', 'P'), ('D', 'M'),
           ('J', 'P'), ('J', 'M'), ('P', 'M'), ('B', 'D', 'J'), ('B', 'D', 'P'), ('B', 'D', 'M')]

dic = {'B': [1, 0, 1, 1], 'D': [1, 1, 0, 1], 'J': [0, 0, 1, 1], 'P': [1, 1, 0, 1], 'M': [1, 0, 0, 1]}


def element_wise_sum(l, o):
    return [a + b for a, b in zip(l, o)]


res = [reduce(element_wise_sum, [dic[label] for label in labels]) for labels in my_list]
print(res)

输出

[[1, 0, 1, 1], [1, 1, 0, 1], [2, 1, 1, 2], [1, 0, 2, 2], [2, 1, 1, 2], [2, 0, 1, 2], [1, 1, 1, 2], [2, 2, 0, 2], [2, 1, 0, 2], [1, 1, 1, 2], [1, 0, 1, 2], [2, 1, 0, 2], [2, 1, 2, 3], [3, 2, 1, 3], [3, 1, 1, 3]]

您可以使用简单的 for 循环来迭代主列表并像这样使用列表理解获取键和总和,

mylist=[('B',), ('D',), ('B', 'D'), ('B', 'J'), ('B', 'P'), ('B', 'M'), ('D', 'J'), ('D', 'P'), ('D', 'M'), ('J', 'P'), ('J', 'M'), ('P', 'M'), ('B', 'D', 'J'), ('B', 'D', 'P'), ('B', 'D', 'M')]

dict={'B': [1, 0, 1, 1], 'D': [1, 1, 0, 1], 'J': [0, 0, 1, 1], 'P': [1, 1, 0, 1], 'M': [1, 0, 0, 1]}

myresult = []
for i in mylist:
    keys = [dict.get(j) for j in i]
    summation = [sum(x) for x in zip(*keys)]
    myresult.append(tuple(summation))
print(myresult)

示例: https ://rextester.com/ANFN30711

试试这个:(将dict更改为dct ,因为建议不要使用内置函数作为变量(内置函数))

res = []
for k in mylist:
    res.append(tuple(map(sum, zip(*(dct.get(i, []) for i in k)))))
print(res)       

# As one-line 
# res = [tuple(map(sum, zip(*(dct.get(i, []) for i in k)))) for k in mylist]

[(1, 0, 1, 1), (1, 1, 0, 1), (2, 1, 1, 2), (1, 0, 2, 2), (2, 1, 1, 2), (2, 0, 1, 2), (1, 1, 1, 2), (2, 2, 0, 2), (2, 1, 0, 2), (1, 1, 1, 2), (1, 0, 1, 2), (2, 1, 0, 2), (2, 1, 2, 3), (3, 2, 1, 3), (3, 1, 1, 3)]

解释:

# for example for  ('B', 'D', 'M')
# dct.get() -> [1, 0, 1, 1], [1, 1, 0, 1], [1, 0, 0, 1]
>>> list(zip(*[[1, 0, 1, 1], [1, 1, 0, 1], [1, 0, 0, 1]]))
[(1, 1, 1), (0, 1, 0), (1, 0, 0), (1, 1, 1)]

>>> tuple(map(sum, zip(*[[1, 0, 1, 1], [1, 1, 0, 1], [1, 0, 0, 1]])))
(3, 1, 1, 3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM