将字典与平均值相交

时间:2013-06-22 21:02:33

标签: python dictionary intersect

如果我有这本词典:

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}

3 个答案:

答案 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之类的东西会做得更好。