繁体   English   中英

按值对字典/列表进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM