如何从分数列表中pythonicly创建高分榜词

时间:2017-03-09 19:46:05

标签: python list-comprehension dictionary-comprehension

在python中,假设我有一个玩家姓名和分数的键值对列表,如下所示:

[
    ('ABC', 129),
    ('JON', 205),
    ('DON', 90),
    ('ABC', 300),
    ('DON', 50)
]

从这个列表中我想提取一个像这样的高分词典:

{
    'ABC': 300,
    'DON': 90,
    'JON': 205,
}

奖金 - 问题:如何创建这样的得分历史词典并保持原始列表中每个得分的顺序?

{
    'ABC': [129, 300]
    'DON': [90, 50]
    'JON': [205]
}

显然,使用for循环实现解决方案非常容易,但最pythonic方式,即如何使用 list / dictionary comprehension

2 个答案:

答案 0 :(得分:2)

第二部分是一个非常标准的事情:

allscores = [
    ('ABC', 129),
    ('JON', 205),
    ('DON', 90),
    ('ABC', 300),
    ('DON', 50)
]

from collections import defaultdict
scores = defaultdict(list)
for key, val in allscores:
    scores[key].append(val)

将您的分数分组后,您只需获取每个列表的max

>>> topscores = dict( (k, max(v)) for k, v in scores.items() )
>>> print(topscores)
{'ABC': 300, 'DON': 90, 'JON': 205}

答案 1 :(得分:1)

找到一个有效的解决方案:

scores_list = [
    ('ABC', 129),
    ('JON', 205),
    ('DON', 90),
    ('ABC', 300),
    ('DON', 50)
]

scores_history_dict = { k1: [v2 for (k2, v2) in scores_list if k1 == k2] for (k1, v1) in scores_list }
print scores_history_dict

highscores_dict = { k1: max([v2 for (k2, v2) in scores_list if k1 == k2]) for (k1, v1) in scores_list }
print highscores_dict

有什么想法?谁有更多的pythonic,更聪明的方法?

相关问题