繁体   English   中英

如何在元组列表中找到每个相似条目的平均值?

[英]How can I find the average of each similar entry in a list of tuples?

我有这个元组列表

[('Jem', 10), ('Sam', 10), ('Sam', 2), ('Jem', 9), ('Jem', 10)]

如何找到与每个名称相关的数字的平均值,即存储在带有Jem的元组中的所有数字的平均值,然后输出它们? 在此示例中,输出将是:

Jem 9.66666666667
Sam 6

看起来像collections.defaultdict的直接案例

from collections import defaultdict
l = [('Jem', 10), ('Sam', 10), ('Sam', 2), ('Jem', 9), ('Jem', 10)]
d = defaultdict(list)
for key, value in l:
    d[key].append(value)

然后计算平均值

from numpy import mean
for key in d:
    print(key, mean(d[key]))

产量

Jem 9.66666666667
Sam 6.0

有几种方法可以做到这一点。 一个很容易,一个很漂亮。

简单:

使用字典! 很容易构建一个遍历元组的for循环,并将第二个元素附加到字典中,键入第一个元素。

d = {}
tuples = [('Jem', 10), ('Sam', 10), ('Sam', 2), ('Jem', 9), ('Jem', 10)]
for tuple in tuples:
    key,val = tuple
    d.setdefault(key, []).append(val)

一旦它出现在字典中,你就可以:

for name, values in d.items():
    print("{name} {avg}".format(name=name, avg=sum(values)/len(values)))

漂亮:

使用itertools.groupby 这仅适用于您按照要分组的键对数据进行排序的情况(在这种情况下,对于tuples每个tt[0] ),因此在这种情况下它并不理想,但这是一种突出该功能的好方法。

from itertools import groupby

tuples = [('Jem', 10), ('Sam', 10), ('Sam', 2), ('Jem', 9), ('Jem', 10)]
tuples.sort(key=lambda tup: tup[0])
# tuples is now [('Jem', 10), ('Jem', 9), ('Jem', 10), ('Sam', 10), ('Sam', 2)]

groups = groupby(tuples, lambda tup: tup[0])

这构建了一个看起来像这样的结构:

[('Jem', [('Jem', 10), ('Jem', 9), ('Jem', 10)]),
 ('Sam', [('Sam', 10), ('Sam', 2)])]

我们可以用它来建立我们的名字和平均值:

for groupname, grouptuples in groups:
    values = [t[1] for t in groupvalues]
    print("{name} {avg}".format(name=groupname, avg=sum(values)/len(values)))

您还可以使用列表推导:

l = [('Jem', 10), ('Sam', 10), ('Sam', 2), ('Jem', 9), ('Jem', 10)]

def avg(l):
    return sum(l)/len(l)

result = [(n, avg([v[1] for v in l if v[0] is n])) for n in set([n[0] for n in l])]
# result is [('Jem', 9.666666666666666), ('Sam', 6.0)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM