元组列表中的平均项目,按元组中的值

时间:2018-07-24 06:04:29

标签: python python-3.x

total = [(1, 'red'), (10, 'green'), (9, 'red'), (10, 'blue'), (5, 'blue')]

我希望能够按颜色对上述元组列表进行平均。所以我的预期输出是

averaged = [(5, 'red'), (10, 'green'), (7.5, 'blue')]或类似的内容。

我不确定如何解决这个问题,但是目前我唯一的想法组织得很差,我必须想象有更好的方法。我尝试使用set来获取唯一性,但是我不确定如何使用它,并牢记元组的第一个元素中的值和平均值。任何想法或指示都将不胜感激

4 个答案:

答案 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)

您可以使用itertoolsnumpy来解决此问题。

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