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

时间:2015-06-12 13:05:12

标签: python list dictionary

我正在创建一个游戏,我想打印出从最高到最低的用户分数。

这是我目前的代码

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个生命),并以此为基础。我需要将用户名和最高分打印到最低。

Sort a Python dictionary by value处的解决方案不起作用。我最终得到的输出如下:

[('Alex', [1]), ('Joeseph', [32, 576]), ('Steve', [33]), ('Bob', [55, 22])]

未分类。

3 个答案:

答案 0 :(得分:1)

从您的案例到答案的不同之处在于,您可以将其与每个键的值进行比较,因为它是一个列表。你必须比较(我想)与该列表中的最高分 - 所以关键功能必须处理:

SELECT banner_id
FROM YourTable
WHERE subject_code IN ('engl', 'math')
GROUP BY banner_id
HAVING COUNT(DISTINCT subject_code) > 1

答案 1 :(得分:0)

首先,从所有得分列表中获得每位玩家的最高分:

>>> 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))

答案 2 :(得分:0)

Python 2 这是一种方法: 的 EDITED

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)]