>>> 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
がうまくいくでしょう。