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

Python:查找相同列表的出现次数并求平均值,python,list,average,defaultdict,Python,List,Average,Defaultdict,我将用一个例子来解释我的问题: A=[[1,2,10],[1,2,10],[3,4,5]] B=[[1,2,30],[6,7,9]] 从这些列表中,我想创建第三个列表: C=A+B 所以我得到: C= [[1, 2, 10], [1, 2, 10], [3, 4, 5], [1, 2, 30], [6, 7, 9]] 注意C中有三个列表, [1,2,10],[1,2,10],[1,2,30]列表,如果用[x,y,z]来描述,它们具有相同的x,y,但不同的z 因此,我想要一份新的清单: 我们

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

A=[[1,2,10],[1,2,10],[3,4,5]]
B=[[1,2,30],[6,7,9]]
从这些列表中,我想创建第三个列表:

C=A+B
所以我得到:

C= [[1, 2, 10], [1, 2, 10], [3, 4, 5], [1, 2, 30], [6, 7, 9]]
注意C中有三个列表, [1,2,10],[1,2,10],[1,2,30]列表,如果用[x,y,z]来描述,它们具有相同的x,y,但不同的z

因此,我想要一份新的清单:

我们从列表中只找到一个相同的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执行此操作?有什么想法吗?

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

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

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

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

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

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

如果x和z相同,但是y不同呢?不,只有x,y必须相同。为了进一步说明这一点,我们假设x,y是坐标,z是温度。不确定精确程度,但如何匹配列表中的项目,如果x,y相等,则将该元素附加到新列表中,然后你将平均第三个位置我试过了,但我正在处理大列表,希望避免创建更多的列表:如果x和z相同,但是y不同呢?不,只有x,y必须相同。为了进一步说明这一点,我们假设x,y是坐标,z是温度。不确定精确程度,但如何匹配列表中的项目,如果x,y相等,则将该元素附加到新列表中,然后你将平均第三个位置我尝试过,但我正在处理大列表,希望避免创建更多的列表:我得到[[1,2,16],[3,4,5],[6,7,9]]。知道我为什么会得到整数吗?我正在使用Python 2.7.3。好的,如果都是整数,则返回整数。对于Python2.x来说,这没关系。您需要转换为float。我得到了[1,2,16],[3,4,5],[6,7,9]。知道我为什么会得到整数吗?我正在使用Python 2.7.3。好的,如果都是整数,则返回整数。对于Python2.x来说,这没关系。您需要转换为float。比如说,谢谢你。我还不习惯defaultdict可以实现什么,这让我大开眼界。谢谢大家。我还不习惯defaultdict可以实现什么,这让我大开眼界。