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

sam*_*egh 3 python tuples list

我有这个元组列表

[('Jem', 10), ('Sam', 10), ('Sam', 2), ('Jem', 9), ('Jem', 10)]
Run Code Online (Sandbox Code Playgroud)

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

Jem 9.66666666667
Sam 6
Run Code Online (Sandbox Code Playgroud)

Cor*_*mer 5

似乎是一个直截了当的案例 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)
Run Code Online (Sandbox Code Playgroud)

然后计算平均值

from numpy import mean
for key in d:
    print(key, mean(d[key]))
Run Code Online (Sandbox Code Playgroud)

产量

Jem 9.66666666667
Sam 6.0
Run Code Online (Sandbox Code Playgroud)


Ada*_*ith 5

有几种方法可以做到这一点。一个简单,一个漂亮。

简单:

使用字典!很容易构建一个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)
Run Code Online (Sandbox Code Playgroud)

一旦它在字典中,您可以执行以下操作:

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

漂亮:

使用itertools.groupby. 这仅在您的数据按您要分组的键(在这种情况下,t[0]对于每个tin tuples)进行排序时才有效,因此在这种情况下并不理想,但这是突出显示功能的好方法。

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])
Run Code Online (Sandbox Code Playgroud)

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

[('Jem', [('Jem', 10), ('Jem', 9), ('Jem', 10)]),
 ('Sam', [('Sam', 10), ('Sam', 2)])]
Run Code Online (Sandbox Code Playgroud)

我们可以使用它来构建我们的名称和平均值:

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