如果我有这本词典:
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}
如果我有这本词典:
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}
使用 dict 理解:
>>> 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}
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)
(主体可以保持完全相同)。
>>> 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)
,然后将其除以字典的数量,因此我们得到该键的平均值,然后通过生成器将其打包到结果字典中表达。
PS我不会调用这个函数intersect
。类似的东西common_key_average
会做得更好。