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
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)それらをリストにラップする代わりにlike で呼び出せるようにしたい場合は、def行をdef intersect(*dicts)(本体はまったく同じままでかまいません) に変更するだけです。

于 2013-06-22T21:12:21.540 に答える
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 に答える
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

reduceandすべてのメンバーに適用するだけなので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 に答える