我需要找到一个像[('a', 5), ('b', 2), ('a', 4), ('b', 6)]
结果应该像; [('a', 4.5), ('b', 4)]
答案 0 :(得分:3)
您可以将所有元组放在defaultdict中,使用第一个值将它们分组为列表,然后计算均值:
collectstatic
答案 1 :(得分:2)
您可以使用collections.defaultdict()
收集数字,然后在每组数字上应用statistics.mean()
:
from statistics import mean
from collections import defaultdict
lst = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]
d = defaultdict(list)
for k, v in lst:
d[k].append(v)
means = [(k, mean(v)) for k, v in d.items()]
print(means)
# [('a', 4.5), ('b', 4)]
您还可以使用itertools.groupby()
对元组进行分组:
from statistics import mean
from itertools import groupby
from operator import itemgetter
lst = [("a", 5), ("b", 2), ("a", 4), ("b", 6)]
means = [
(k, mean(map(itemgetter(1), g)))
for k, g in groupby(sorted(lst, key=itemgetter(0)), key=itemgetter(0))
]
print(means)
[('a', 4.5), ('b', 4)]
答案 2 :(得分:2)
我们可以为此使用熊猫:
import pandas as pd
pd.DataFrame(data).groupby(0)[1].mean().to_dict()
这将给我们:
>>> pd.DataFrame(data).groupby(0)[1].mean().to_dict()
{'a': 4.5, 'b': 4.0}
或者我们可以使用以下命令将其转换为2元组列表:
list(pd.DataFrame(data).groupby(0)[1].mean().to_dict().items())
给出:
>>> list(pd.DataFrame(data).groupby(0)[1].mean().to_dict().items())
[('a', 4.5), ('b', 4.0)]
因此,上述方法更像是一种“ 声明式”方法:我们指定所需的 ,而我们所需的方式则不多。
答案 3 :(得分:2)
没有其他库的原始解决方案如下所示:
def mean(l):
result = {}
for key, value in l:
if key not in result:
result[key] = []
result[key].append(value)
return [(k, sum(v)/len(v)) for k, v in result.items()]
lst = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]
m = mean(lst)
print(m)
# [('a', 4.5), ('b', 4.0)]
答案 4 :(得分:2)
如果愿意,还可以尝试以下可重复使用的代码(无需使用任何外部库)。
>>> def get_mean(l):
... d = {}
... for k, v in l:
... if k in d:
... d[k].append(v)
... else:
... d[k] = [v]
... result = [(k, sum(d[k])/len(d[k])) for k in d]
... return result
...
>>> l = [('a', 5), ('b', 2), ('a', 4), ('b', 6)]
>>> new_l = get_mean(l)
>>> new_l
[('a', 4.5), ('b', 4.0)]
>>>