如何找到元组列表中每个相似条目的平均值?
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
。这仅在您的数据按您要分组的键排序时才有效(在这种情况下,t[0]
对应 tuples
中的每个 t
),因此在这种情况下它并不理想,但它是突出功能的好方法。
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)]
我有这个元组列表
[('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
。这仅在您的数据按您要分组的键排序时才有效(在这种情况下,t[0]
对应 tuples
中的每个 t
),因此在这种情况下它并不理想,但它是突出功能的好方法。
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)]