Python:查找相同列表的出现次数和平均值

2024-09-30 01:37:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我将用一个例子来解释我的问题:

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

从这些列表中,我想创建第三个列表:

^{pr2}$

所以我得到:

^{3}$

请注意,C中有三个列表, [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, 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来实现吗?有什么想法吗?在


Tags: 方法infromimport列表forcollections例子
2条回答

您需要先对数据进行排序:

>>> 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]]

如果你想在分组前平均:

^{pr2}$

在您的代码中,您不能除以观察值的数量。我把你的密码改成了 收集给定对(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

结果:

^{pr2}$

相关问题 更多 >

    热门问题