我有一个如下所示的列表:
A= [('1', 3), ('2', 7), ('3', 5), ('1', 7), ('2', 5), ('3', 1)]
我想要从列表A
生成如下输出列表:
Average = [('1', 5), ('2', 6), ('3', 2)]
任何技巧都将非常感激!=)
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)]
sum(v, 0.0) / len(v)
代替sum(v) // len(v)
。 - Sven Marnachresult = {}
for key, value in A:
result.setdefault(key, []).append(value)
print [(k, sum(v) // len(v) for k,v in result.iteritems()]
setdefault
,那么defaultdict
绝对是最好的选择。 - agfgroup
函数是你工具箱中有用的模式。它类似于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}
一行代码。
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)))))