【问题标题】:How to get a list of dictionaries sorted by three criteria如何获取按三个条件排序的字典列表
【发布时间】:2021-11-10 02:02:19
【问题描述】:

我想得到一个根据以下规则排序的列表persons.sort(key = lambda p: (abs(p["height"] - 180), p["weight"]==75, p["weight"])) 即我需要它首先按其与高度 180 的接近程度进行排序,然后是所有等于 75 的权重值,然后我想要它们按权重升序排列...

我想出了以下代码,但它不起作用...

def get_ordered_list(persons):
    persons.sort(key = lambda p: p["name"] )
    persons.sort(key = lambda p: (abs(p["height"] - 180), p["weight"]==75, p["weight"]))
    return persons

以下面的示例数据为例,

array = [{"name": "Guido Batista", "height": 195, "weight": 110},
    {"name":"Heitor Tostes", "height": 180, "weight": 75},
    {"name":"Bruno Costa", "height": 180, "weight": 75},
    {"name":"Joao Kleber", "height": 180, "weight": 65},
    {"name":"Rafael Rodrigues", "height": 165, "weight": 110},
    {"name":"Ricardo Neto", "height": 170, "weight": 70},
    {"name":"Juca Carvalho", "height": 180, "weight": 77}]
    

我需要将列表按如下方式排序:

[
      {"name":"Bruno Costa", "height": 180, "weight": 75},
      {"name":"Heitor Tostes", "height": 180 , "weight": 75},
      {"name":"Joao Kleber", "height": 180, "weight": 65},
      {"name":"Juca Carvalho", "height": 180, "weight": 77},
      {"name":"Ricardo Neto", "height": 170, "weight": 70},
      {"name": "Guido Batista", "height": 195, "weight": 110},
      {"name":"Rafael Rodrigues", "height": 165, "weight": 110},
]

【问题讨论】:

  • 您能否说明发生了什么错误。
  • 哦,是的..我可以...结果输出如下 [{'name': 'Joao Kleber', 'height': 180, 'weight': 65}, { 'name': 'Juca Carvalho', 'height': 180, 'weight': 77}, {'name': 'Bruno Costa', 'height': 180, 'weight': 75},{'name': 'Heitor Tostes', 'height': 180, 'weight': 75}, {'name': 'Ricardo Neto', 'height': 170, 'weight': 70}, {'name': 'Guido Batista' , 'height': 195, 'weight': 110}, {'name': 'Rafael Rodrigues', 'height': 165, 'weight': 110}]...这不是正确的顺序...实际上没有利用第二个标准。

标签: python list sorting dictionary sortedlist


【解决方案1】:

发生这种情况是因为False 的值低于True。使用

 persons.sort(key = lambda p: (abs(p["height"] - 180), p["weight"]!=75, p["weight"]))

更改“重量”键的比较。

【讨论】:

    【解决方案2】:

    这将提供所需的结果,而不会进一步复杂化:

    persons.sort(key = lambda p: (abs(p["height"] - 180), not(p["weight"]==75), p["weight"]))
    

    默认情况下,排序顺序是升序。最后一个难题是这个(来自doc

    布尔值:这些表示真值 False 和 True。他们俩 表示值 False 和 True 的对象是唯一的布尔值 对象。 Boolean 类型是纯整数的子类型,Boolean 在几乎所有的情况下,值的行为分别类似于值 0 和 1 上下文,例外是当转换为字符串时, 分别返回字符串“False”或“True”

    按照升序,0 在 1 之前,这就是为什么上面发布的这行代码可以解决问题。

    【讨论】:

      【解决方案3】:

      试试:

      array = [
          {"name": "Guido Batista", "height": 195, "weight": 110},
          {"name": "Heitor Tostes", "height": 180, "weight": 75},
          {"name": "Bruno Costa", "height": 180, "weight": 75},
          {"name": "Joao Kleber", "height": 180, "weight": 65},
          {"name": "Rafael Rodrigues", "height": 165, "weight": 110},
          {"name": "Ricardo Neto", "height": 170, "weight": 70},
          {"name": "Juca Carvalho", "height": 180, "weight": 77},
      ]
      
      array = sorted(
          array,
          key=lambda p: (
              abs(p["height"] - 180),
              p["weight"] != 75,
              p["name"],
              -p["weight"],
          ),
      )
      print(array)
      

      打印:

      [
          {"name": "Bruno Costa", "height": 180, "weight": 75},
          {"name": "Heitor Tostes", "height": 180, "weight": 75},
          {"name": "Joao Kleber", "height": 180, "weight": 65},
          {"name": "Juca Carvalho", "height": 180, "weight": 77},
          {"name": "Ricardo Neto", "height": 170, "weight": 70},
          {"name": "Guido Batista", "height": 195, "weight": 110},
          {"name": "Rafael Rodrigues", "height": 165, "weight": 110},
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 2010-09-09
        相关资源
        最近更新 更多