[英]Sort a dictionary/list by value
我正在创建一个游戏,我希望将用户分数从最高分打印到最低分。
到目前为止,这是我的代码
player_scores = {}
for line in reversed(open("playerscores.txt").readlines()):
name, score = line.rstrip('\n').split(' / ')
score = int(score)
if name in player_scores and len(player_scores[name]) < 3:
player_scores[name].append(score)
if name not in user_scores:
player_scores[name] = list((score,))
playercores.txt中的名称存储方式如下:
Bob / 10
Jill / 10
我的代码从用户(最近3个生命)中获取了最后3个分数,并以此为基础。 我需要将用户名以及最高分数打印到最低分数。
按值对Python字典排序的解决方案不起作用。 我最终得到如下输出:
[('Alex', [1]), ('Joeseph', [32, 576]), ('Steve', [33]), ('Bob', [55, 22])]
没有排序。
从您的案例到答案是重复的案例的区别在于,在这种情况下,您可以将其与每个键的值进行比较,因为它是一个列表。 您必须将(我想)与该列表中的最高分数进行比较-因此按键功能必须注意这一点:
score_list = sorted(player_scores.items(), key=lambda item: max(item[1]))
首先,从所有分数列表中获取每个球员的最高分数:
>>> player_scores = dict([('Alex', [1]), ('Joeseph', [32, 576]), ('Steve', [33]), ('Bob', [55, 22])])
>>> top_scores = {name: max(scores) for name, scores in player_scores.items()}
现在,您可以使用operator.itemgetter
进行值排序。 记住要扭转结果!
>>> sorted(top_scores.items(), key=operator.itemgetter(1), reverse=True)
[('Joeseph', 576), ('Bob', 55), ('Steve', 33), ('Alex', 1)]
最后,要进行打印,只需执行以下操作
for name, score in your_sorted_scores_list:
print("{:20} - {}".format(name, score))
Python 2这是一种实现方式: 编辑
player_scores = {
'Bob': 12,
'Pete': 3,
'Jim': 10,
'Joe': 15,
'Bill': 14,
'Sam': 2,
'Tim': 10
}
k = sorted(player_scores, key=player_scores.__getitem__, reverse=True)
v = sorted(player_scores.values(), reverse=True)
sorted_player_scores = zip(k,v)
print sorted_player_scores
输出:
[('Joe', 15), ('Bill', 14), ('Bob', 12), ('Jim', 10), ('Tim', 10), ('Pete', 3), ('Sam', 2)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.