如果我有这本词典:
a = {'alpha':12,'beta':13,'gamma':14}
和这一个:
b = {'andora':19,'beta:14','gamma':19}
和这一个:
c = {'beta':11,'gamma':20}
如何与键相交,使得结果字典的值将作为给定字典中值的平均值。
例如:
intersect([a,b,c]) -> {'beta':12.6666666667,'gamma':17.6666666667}
答案 0 :(得分:1)
使用词典理解:
>>> keys = a.viewkeys() & b.viewkeys() & c.viewkeys()
>>> keys
set(['beta', 'gamma'])
>>> {k: (a[k]+b[k]+c[k])/3.0 for k in keys}
{'beta': 12.666666666666666, 'gamma': 17.666666666666668}
功能:
>>> def get_keys(*args):
... return reduce(set.intersection,map(set,args))
...
>>> get_keys(a,b,c)
set(['beta', 'gamma'])
intersect
功能:
def intersect(dics):
keys = reduce(set.intersection,map(set,dics))
return {k: sum(x[k] for x in dics)/float(len(dics)) for k in keys}
...
>>> intersect([a,b,c])
{'beta': 12.666666666666666, 'gamma': 17.666666666666668}
答案 1 :(得分:1)
def intersect(dicts):
common_keys = reduce(set.intersection, map(set, dicts))
num = float(len(dicts))
return {k: sum(d[k] for d in dicts)/num for k in common_keys}
示例:
>>> a = {'alpha':12,'beta':13,'gamma':14}
>>> b = {'andora':19,'beta':14,'gamma':19}
>>> c = {'beta':11,'gamma':20}
>>> intersect([a, b, c])
{'beta': 12.666666666666666, 'gamma': 17.666666666666668}
如果您希望能够像intersect(a, b, c)
一样调用它而不需要将它们包含在列表中,只需将def
行更改为def intersect(*dicts)
(正文可以完全保留相同)。
答案 2 :(得分:0)
>>> from operator import and_
>>> from __future__ import division
>>> def intersect(*dicts):
return dict((key,sum(D[key] for D in dicts)/len(dicts)) for key in reduce(and_,map(set,dicts)))
>>> intersect(a,b,c)
{'beta': 12.666666666666666, 'gamma': 17.666666666666668}
and_
只是运营商,执行以下and_(a,b) === a and b
。
reduce
只需将and
应用于所有成员,即reduce(and_,map(set,dicts)) === a and b and c
,它会生成字典键的交集。
>>> reduce(and_,map(set,dicts))
set(['beta', 'gamma'])
然后我们只是通过所有这些键并计算与该键sum(D[key] for D in dicts)
对应的所有序列中的值的总和,并将其除以dicts的数量,这样我们得到该键的平均值,然后通过生成器表达式将它打包到生成的字典中。
P.S。我不会将此函数称为intersect
。像common_key_average
之类的东西会做得更好。