从Python列表中找到最大平均值

3

我有一个列表:

input= [
   ["Pakistan", 23],
   ["Pakistan", 127],
   ["India", 3],
   ["India", 71],
   ["Australia", 31],
   ["India", 22],
   ["Pakistan", 81]
]

现在我想过滤出只有最高平均值的键值。就像在这种情况下输出应该是“巴基斯坦”:
out = "Pakistan"

有人能帮忙吗?


首先,我正在尝试分离键和值,以便我可以取平均值。 - Hill Stone
请发布您编写的代码以解决此问题,我们将帮助您找到一个解决方案。 - GaneshTata
解决方案已经给出,请查看下面。 - Hill Stone
我建议尝试使用numpy数组,并在numpy.max中设置axis kwarg。 - user7345804
我也在尝试着,但解决方案已经在这里了。 - Hill Stone
4个回答

7
你可以使用Pandas:
import pandas as pd

l =  [
["Pakistan", 23],
["Pakistan", 127],
["India", 3],
["India", 71],
["Australia", 31],
["India", 22],
["Pakistan", 81]
]

pd.DataFrame(l).groupby([0]).mean().idxmax().values[0]

输出:

'Pakistan'

2
@Scott 恕我直言,为什么你不等待 OP 先发布一些样本代码呢?我们的职责不是先尝试理解 OP 的方法,然后指导他/她找到解决方案吗? - GaneshTata

3
另一种版本(仅使用stdlib):
from __future__ import division
import collections

input= [
   ["Pakistan", 23],
   ["Pakistan", 127],
   ["India", 3],
   ["India", 71],
   ["Australia", 31],
   ["India", 22],
   ["Pakistan", 81]
]


t = collections.defaultdict(list)

for c,n in input:
    t[c].append(n)


max(t, key=lambda c: sum(t[c]) / len(t[c]))
'Pakistan'

在Python 2中,整数除法可能会出现问题:sum(t[c]) / len(t[c]),而在Python 3中,您可以使用statistics.mean - Akavall

2
这是另一种实现方式的变体。
from collections import defaultdict
import operator

input= [
   ["Pakistan", 23],
   ["Pakistan", 127],
   ["India", 3],
   ["India", 71],
   ["Australia", 31],
   ["India", 22],
   ["Pakistan", 81]
]
cv_dict=defaultdict(list)

for key, score in input:
    cv_dict[key].append(score)

for k,v in cv_dict.items():
        cv_dict[k]=sum(v)/len(v)

max(cv_dict, key=cv_dict.get)

希望这能有所帮助!

1

为什么不尝试使用内置的max方法,而不导入任何重型外部模块或使其过于复杂?

input= [
   ["Pakistan", 23],
   ["Pakistan", 127],
   ["India", 3],
   ["India", 71],
   ["Australia", 31],
   ["India", 22],
   ["Pakistan", 81]
]

track={}
for i in input:
    if i[0] not in track:
        track[i[0]]=[i[1]]
    else:
        track[i[0]].append(i[1])

print(max([(sum(j)/len(j),i) for i,j in track.items()]))

输出:

(77.0, 'Pakistan')

问题要求的是平均值最高的键值,而不是具有最高数量的键值。 - GaneshTata
@GaneshTata 感谢您指出,我已经更新了解决方案。 - Aaditya Ura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接