如何使用权重将字典合并在一起?

TIM*_*MEX 2 python computer-science dictionary

d1 = {'weight':1, 'data': { 'apples': 8, 'oranges': 7 } }
d2 = {'weight':3, 'data': { 'apples': 4, 'bananas': 3 } }
all_dictionaries = [d1, d2, ... ]

def mergeDictionariesWithWeight(all_dictionaries)
Run Code Online (Sandbox Code Playgroud)

如何将这些词典合并在一起(如果重叠,多重值与重量)

该函数将返回:

{ 'apples': 4, 'oranges': 7, 'bananas': 3 }
Run Code Online (Sandbox Code Playgroud)

苹果是4因为8 * .25 + 4 * .75

编辑:我刚刚写了一个平均值,这样的东西.但是当然它与我想做的事情有很大不同,因为我把所有东西都放在一个列表中,然后除以长度.

result = {}
keymap = {}
for the_dict in dlist:
    for (k, v) in the_dict.items():
        if not keymap.has_key(k):
            keymap[k] = []
        keymap[k].append(v)
for (k, v) in keymap.items():
    average = sum(int(x) for x in keymap[k]) / float(len(keymap[k]))
    result[k] = float(average)
return result
Run Code Online (Sandbox Code Playgroud)

Joh*_*ooy 7

>>> from collections import defaultdict
>>> d=defaultdict(lambda:(0,0))
>>> for D in all_dictionaries:
...   weight = D['weight']
...   for k,v in D['data'].items():
...     d[k]=d[k][0]+weight*v,d[k][1]+weight
... 
>>> dict((k,v[0]/v[1]) for k,v in d.items())
{'apples': 5, 'oranges': 7, 'bananas': 3}
Run Code Online (Sandbox Code Playgroud)

如果需要浮点结果

>>> dict((k,1.*v[0]/v[1]) for k,v in d.items())
{'apples': 5.0, 'oranges': 7.0, 'bananas': 3.0}
Run Code Online (Sandbox Code Playgroud)

关于defaultdict的注释

经常你看到defaultdict(int)甚至defaultdict(list)可能defaultdict(set).defaultdict的参数必须可以调用,不带参数.只要发现密钥丢失,就会使用调用此参数的结果.ie - 调用this返回字典的默认值

例如

>>> d=defaultdict(int)
>>> d[1]
0
>>> d['foo']
0
Run Code Online (Sandbox Code Playgroud)

这通常用于计算,因为int()返回0.如果你想要默认值为1而不是0,它更棘手,因为你不能将参数传递给int,但你需要的只是一个返回1的可调用.这可以通过使用lambda函数毫不费力地完成.

>>> d=defaultdict(lambda:1)
>>> d[1]
1
>>> d['foo']
1
Run Code Online (Sandbox Code Playgroud)

在这个答案中,我想跟踪加权总数和权重总和.我可以通过使用2元组作为默认值来完成此操作.

>>> d=defaultdict(lambda:(0,0))
>>> d[1]
(0, 0)
>>> d['foo']
(0, 0)
Run Code Online (Sandbox Code Playgroud)