按前 3 个条目的平均值对每个用户列表进行排序

Sorting per-user list by average value of top-3 entries

我有一些数据,它是每个不同用户的分数列表。 下面的代码找到用户最后三个分数的最大值(排序以便首先显示分数最低的用户),并将其打印出来:

dlist = {c:max(d[c][-3:]) for c in d} #max for each user from last 3
itmlist = sorted(dlist.items(), key=lambda x: x[1]) #sort items
for z in itmlist:
  print('{}: {} '.format(z[0], z[1])) #print user-by-user

我正在尝试将其修改为使用 sum(l)/len(l) 以便找到每个用户的最后三个分数的平均值,然后对其进行排序以按顺序打印最低的用户平均值,但是走进了死胡同。

任何人都可以指出正确的方向吗?

--

编辑:

这是用于生成列表的代码。我正在使用一个包含数据的文本文件,该数据包含格式如下的分数:

鲍勃:2
John:7

然后使用此阅读:

[查看 post 历史记录]

如果你只关心最后三个分数的平均值:

dlist = {c:sum(d[c][-3:]) for c in d} #sum of last three scores for each user
itmlist = sorted(dlist.items(), key=lambda x: x[1]) #sort items on score
for z in itmlist:
  print('{}: {} '.format(z[0], z[1]/3)) #print user-by-user

defaultdict、deque 和 statistics.mean 将执行您想要的操作:

from collections import defaultdict, deque
from statistics import mean

# store maximum three scores using a defaultdict for repeated keys
d = defaultdict(lambda: deque(maxlen=3))

for q in range(1, 4):
    with open('Group{}.txt'.format(q), 'r') as f:
        for record in f:
            x, y = record.split(':')
            d[x].append(int(y))

# sort by values
srt = sorted(d.items(), key=lambda x: x[1])

# print name and mean from sorted list
for name,scores in srt:
    print('{}: {} '.format(name, mean(scores))) #print user-by-user

如果您希望将值设置为平均值,请在排序前更新字典:

for name, scores in d.items():
    d[name] = mean(scores)


for name, mn in sorted(d.items(), key=lambda x: x[1]):
    print('{}: {} '.format(name, mn))

您不需要计算平均值进行排序,因为您的所有值的长度都是 3,因此总分最高的列表将具有最高的平均值。

问题有点不清楚,所以我做了一些假设,如果我哪里错了告诉我?

d = {"bob":[1,2,3,4], "anmol":[5,4,3,2,1], "jhon":[3,2,1,8,7]}

new_sorted_list = sorted(d.keys(), key=lambda x: sum(d[x][-3:])/3)

print new_sorted_list

>>> ['anmol', 'bob', 'jhon']

for record in new_sorted_list:
    print record+"  : "+str(sum(d[record][-3:])/3.0)

>>> anmol  : 2.0
    bob  : 3.0
    jhon  : 5.33333333333
>>> d = {'Bob':[2,4,4,5], 'John':[7,5,5,1]}
>>> dlist = {c:max(d[c][-3:]) for c in d}
>>> dlist2 = {user:sum(scores[-3:])/3 for user,scores in d.items()}
>>> print(*(': '.join(map(str, [person, dlist2.get(person)])) for person in sorted(dlist2, key=dlist.get)), sep='\n')
John: 3.6666666666666665
Bob: 4.333333333333333