【发布时间】:2012-10-16 21:25:49
【问题描述】:
我会用一个例子来解释我的问题:
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 不同。
所以我想要这个新列表:
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 做到这一点吗?有什么想法吗?
【问题讨论】:
-
如果 x 和 z 相同但 y 不同怎么办?
-
不,只有 (x,y) 必须相同。为了更详细地说明这一点,假设 (x,y) 是坐标,z 是温度。
-
不确定如何精确,但是如何匹配列表中的项目,如果 x,y 相等,将该元素附加到新列表中,然后您将平均第三个位置跨度>
-
我试过了,但我正在处理大型列表,并希望避免创建更多列表:)
标签: python list average defaultdict