计算列表中相同索引的平均值python

时间:2011-11-07 15:58:49

标签: python list

我有一个如下列表:

A= [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)]

从列表A,我想生成如下输出列表:

Average = [('1', 5), ('2', 6), ('3', 2)]

任何提示都会非常感激! =)

4 个答案:

答案 0 :(得分:3)

from collections import defaultdict
a = [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)]
d = defaultdict(list)
for k, v in a:
    d[k].append(v)
avg = [(k, sum(v) // len(v)) for k, v in d.iteritems()]
print avg

打印

[('1', 5), ('3', 3), ('2', 6)]

请注意,这使用整数除法来计算平均值。您可能希望使用浮点除法。

答案 1 :(得分:1)

以一种简单的方式:

result = {}
for key, value in A:
   result.setdefault(key, []).append(value)

print [(k, sum(v) // len(v) for k,v in result.iteritems()]

答案 2 :(得分:0)

您喜欢抽象代码并重用模式吗?如果是这种情况,则此group函数是您工具集中的有用模式。它与itertools.groupby类似,但它可以在一次迭代中使用非连续元素和分类/映射(将该想法归功于Ruby Facets'map_by):

def group(seq, callback=None):
    result = {}
    for category, item in (callback(seq) if callback else seq):
        result.setdefault(category, []).append(item)
    return result 

average = dict((k, sum(vs)/len(vs)) for (k, vs) in group(xs).items())
print(average)
# {'1': 5.0, '3': 3.0, '2': 6.0}

答案 3 :(得分:-1)

一衬垫。

a= [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)]
map(lambda f:(f[0][0], (lambda g:sum(g)/len(g))(f[1])), map(lambda e:zip(*e), map(lambda c:filter(lambda d:d[0]==c, a), set(map(lambda b:b[0], a)))))