在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
答案 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,更聪明的方法?