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