total = [(1, 'red'), (10, 'green'), (9, 'red'), (10, 'blue'), (5, 'blue')]
我希望能够按颜色对上述元组列表进行平均。所以我的预期输出是
averaged = [(5, 'red'), (10, 'green'), (7.5, 'blue')]
或类似的内容。
我不确定如何解决这个问题,但是目前我唯一的想法组织得很差,我必须想象有更好的方法。我尝试使用set
来获取唯一性,但是我不确定如何使用它,并牢记元组的第一个元素中的值和平均值。任何想法或指示都将不胜感激
答案 0 :(得分:2)
如果您还想维护订单,则可以将项目分组并使用collections.OrderedDict()
计算平均值:
from collections import OrderedDict
total = [(1, 'red'), (10, 'green'), (9, 'red'), (10, 'blue'), (5, 'blue')]
d = OrderedDict()
for count, color in total:
d.setdefault(color, []).append(count)
d = [(sum(v) / len(v), k) for k, v in d.items()]
print(d)
哪个给:
[(5.0, 'red'), (10.0, 'green'), (7.5, 'blue')]
注意::如果您使用的是 Python> = 3.6 ,则只需使用collections.defaultdict()
或普通词典对项目进行分组,因为顺序保持钥匙插入状态。
答案 1 :(得分:0)
尝试一下,这里numpy
用于import mean
求平均值,defaultdict
用于将dict键设置为颜色,并使用值列表作为其编号:< / p>
total = [(1, 'red'), (10, 'green'), (9, 'red'), (10, 'blue'), (5, 'blue')]
from collections import defaultdict
import numpy
d = defaultdict(list)
for k, v in total:
d[v].append(k)
l = [(numpy.mean(j), i) for i,j in d.items()]
print(l)
答案 2 :(得分:0)
您可以使用itertools
和numpy
来解决此问题。
import numpy as np
from itertools import groupby
total = [(1, 'red'), (10, 'green'), (9, 'red'), (10, 'blue'), (5, 'blue')]
total_sorted = sorted(total, key=lambda x: x[1])
result = []
for key, group in groupby(total_sorted, key=lambda x: x[1]):
result.append((key, np.mean(list(map(lambda x: x[0], group)))))
print(result)
# [('blue', 7.5), ('green', 10.0), ('red', 5.0)]
答案 3 :(得分:0)
您可以使用groupby
对列表进行排序后,按第二个项目对元组进行分组,然后计算子列表中第一个项目的平均值。
from itertools import groupby
from operator import itemgetter
print([(sum(map(itemgetter(0), g)) / len(g), k) for k, g in [(k, list(g)) for k, g in groupby(sorted(total, key=itemgetter(1)), itemgetter(1))]])
这将输出:
[(7.5, 'blue'), (10.0, 'green'), (5.0, 'red')]