【问题标题】:How to pythonicly create a dictionary of highscores from a list of scores如何从分数列表中以pythonicly方式创建高分字典
【发布时间】:2017-03-09 19:46:04
【问题描述】:

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

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

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

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

Bonus-Question:我如何创建一个这样的分数历史字典并保持原始列表中每个分数出现的顺序?

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

显然用for循环实现解决方案很容易,但是最pythonic的方式是什么,即如何用列表/字典理解?

【问题讨论】:

    标签: python list-comprehension dictionary-comprehension


    【解决方案1】:

    第二部分是相当标准的做法:

    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}
    

    【讨论】:

      【解决方案2】:

      找到一个可行的解决方案:

      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、更聪明的方法?

      【讨论】:

      • 这是一个很好的pythonic方法,但我不禁认为如果他只实现一个for循环会更快
      • 这将 O(n) 问题转换为 O(n^2) 问题。为什么不只使用普通循环?在这种情况下,它比理解更好。
      猜你喜欢
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 2020-07-06
      • 2020-12-25
      • 2021-01-26
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多