1

如果我有这本词典:

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}

4

3 回答 3

1

使用 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}
于 2013-06-22T21:05:30.887 回答
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)(主体可以保持完全相同)。

于 2013-06-22T21:12:21.540 回答
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),然后将其除以字典的数量,因此我们得到该键的平均值,然后通过生成器将其打包到结果字典中表达。

PS我不会调用这个函数intersect。类似的东西common_key_average会做得更好。

于 2013-06-22T21:14:26.683 回答