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