1

例を使用して問題を説明します。

A=[[1,2,10],[1,2,10],[3,4,5]]
B=[[1,2,30],[6,7,9]]

これらのリストのリストから、3番目のリストを作成したいと思います。

C=A+B

だから私は得る:

C= [[1, 2, 10], [1, 2, 10], [3, 4, 5], [1, 2, 30], [6, 7, 9]]

Cの中に 3つのリストがあることに注意してください。これらの[1, 2, 10], [1, 2, 10], [1, 2, 30]リストは、[x、y、z]で説明すると、x、yは同じですが、zが異なります。

だから私はこの新しいリストが欲しいです:

Averaged= [(1, 2, 16.666), (6, 7, 9), (3, 4, 5)]

ここで、リストから同じx、yのオカレンスが1つだけ見つかります

[1, 2, 30], [1, 2, 40], [1, 2, 50]

および対応するz値の平均(10+10+30)/3=16.666

for最初にループを使用しようとしましたが、最終的にはを使用してこれを実行しようとしましdefaultdictた。

私はこれで、(x、y)を一度保持しますが、対応するz値を加算して平均化しないことになりました。

from collections import defaultdict
Averaged=[]

A=[[1,2,10],[1,2,10],[3,4,5]]
B=[[1,2,30],[6,7,9]]
C=A+B
print "C=",C

ToBeAveraged= defaultdict(int)
for (x,y,z) in C:
    ToBeAveraged[(x,y)] += z
Averaged = [k + (v,) for k, v in ToBeAveraged.iteritems()]    

print 'Averaged=',Averaged

defaultdictでこれを行うことは可能ですか?何か案は?

4

2 に答える 2

3

最初にデータを並べ替える必要があります。

>>> C = sorted(A + B)
>>> def avg(x):
        return sum(x) / len(x)

>>> [[avg(i) for i in zip(*y)] for x,y in 
     itertools.groupby(C, operator.itemgetter(0,1))]
[[1.0, 2.0, 16.666666666666668], [3.0, 4.0, 5.0], [6.0, 7.0, 9.0]]

平均の前にグループが必要な場合:

[list(y) for x,y in itertools.groupby(C, operator.itemgetter(0,1))]
于 2012-10-16T21:32:13.323 に答える
2

コードでは、観測数で割っていません。コードを変更して、特定のペア(x​​、y)のすべての観測値を収集し、それらの平均を取ります。より効率的な解決策があるはずですが、これはうまくいくはずです。

from collections import defaultdict
Averaged=[]

A=[[1,2,10],[1,2,10],[3,4,5]]
B=[[1,2,30],[6,7,9]]
C=A+B
print "C=",C

def get_mean(x):
    return sum(ele for ele in x) / float(len(x))

ToBeAveraged= defaultdict(list)
for (x,y,z) in C:
    ToBeAveraged[(x,y)].append(z)
Averaged = [k + (get_mean(v),) for k, v in ToBeAveraged.iteritems()]    

print 'Averaged=',Averaged

結果:

C= [[1, 2, 10], [1, 2, 10], [3, 4, 5], [1, 2, 30], [6, 7, 9]]
Averaged= [(1, 2, 16.666666666666668), (6, 7, 9.0), (3, 4, 5.0)]
于 2012-10-16T21:46:02.887 に答える