【问题标题】:Sort the nested dictionary based on several conditions根据几个条件对嵌套字典进行排序
【发布时间】:2021-12-24 14:11:23
【问题描述】:

如何按点对嵌套字典进行降序排序,如果有几支球队得分相同,则根据获胜次数,如果几支球队得分相同且获胜次数相同,则根据按字母顺序排列的团队名称。

如下例:

Input = {
'England': {'wins': 1, 'loses': 1, 'draws': 1, 'goal difference': 0, 'points': 4}, 
'Spain': {'wins': 1, 'loses': 0, 'draws': 2, 'goal difference': 2, 'points': 5}, 
'Belgium': {'wins': 1, 'loses': 1, 'draws': 1, 'goal difference': 0, 'points': 4}, 
'Argentina': {'wins': 1, 'loses': 2, 'draws': 0, 'goal difference': -2, 'points': 3}
}

打印输出:

Spain  wins:1 , loses:0 , draws:2 , goal difference:2 , points:5

Belgium  wins:1 , loses:1 , draws:1 , goal difference:0 , points:4

England  wins:1 , loses:1 , draws:1 , goal difference:0 , points:4

Argentina  wins:1 , loses:2 , draws:0 , goal difference:-2 , points:3

【问题讨论】:

    标签: python sorting dictionary nested


    【解决方案1】:

    字典中的项目没有顺序,因此无法排序。

    我建议将这些项目存储为元组列表。每个元组都将国家名称作为一个元素,将数字列表作为另一个元素:

    A = [("England", [1, 1, 1, 0, 4]), ("Spain", [1, 0, 2, 2, 5])]
    

    然后您可以通过实现一个比较器函数并将其与您的列表一起传递给内置的sorted() 函数来对数组进行排序。

    【讨论】:

    • 您可以按原样使用Input 字典上的sorted 函数。您不必将其转换为列表
    【解决方案2】:

    您无法对字典进行排序,因为它的键不按顺序排列。但是您可以使用sorted 函数获得排序后的键和值列表,如下所示:

    Input = {'England': {'wins': 1, 'loses': 1, 'draws': 1, 'goal difference': 0, 'points': 4}, 'Spain': {'wins': 1, 'loses': 0, 'draws': 2, 'goal difference': 2, 'points': 5}, 'Belgium': {'wins': 1, 'loses': 1, 'draws': 1, 'goal difference': 0, 'points': 4}, 'Argentina': {'wins': 1, 'loses': 2, 'draws': 0, 'goal difference': -2, 'points': 3}}
    
    sorted_input = sorted(Input.items(), key=lambda x: x[1]['points'], reverse=True)
    
    print(Input)
    
    for country, stats in sorted_input:
        print(country, stats)
    

    它有这样的语法:sorted(iterable, key=key, reverse=reverse)

    iterable Required. The sequence to sort, list, dictionary, tuple etc.

    key Optional. A Function to execute to decide the order. Default is None

    reverse Optional. A Boolean. False will sort ascending, True will sort descending. Default is False

    它创建一个键和值对的列表

    【讨论】:

      【解决方案3】:

      您可以给sorted 提供一个key 函数来告诉它按照哪个标准进行排序。如果条件是一个元组,那么这些元组将按字典顺序进行比较,即首先比较元组的第一项,如果是平局,则比较第二项,依此类推。

      Input = {
      'England': {'wins': 1, 'loses': 1, 'draws': 1, 'goal difference': 0, 'points': 4}, 
      'Spain': {'wins': 1, 'loses': 0, 'draws': 2, 'goal difference': 2, 'points': 5}, 
      'Belgium': {'wins': 1, 'loses': 1, 'draws': 1, 'goal difference': 0, 'points': 4}, 
      'Argentina': {'wins': 1, 'loses': 2, 'draws': 0, 'goal difference': -2, 'points': 3}
      }
      
      for country,stats in sorted(Input.items(), key=lambda x:(-x[1]['points'],-x[1]['wins'],x[0])):
          print('{:12}'.format(country), end='')
          for name,number in stats.items():
              print('{}:{:2}'.format(name, number), end=', ')
          print()
      
      # Spain       wins: 1, loses: 0, draws: 2, goal difference: 2, points: 5, 
      # Belgium     wins: 1, loses: 1, draws: 1, goal difference: 0, points: 4, 
      # England     wins: 1, loses: 1, draws: 1, goal difference: 0, points: 4, 
      # Argentina   wins: 1, loses: 2, draws: 0, goal difference:-2, points: 3,
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-28
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 2018-10-21
        • 1970-01-01
        • 2014-05-01
        • 2020-04-29
        相关资源
        最近更新 更多