【问题标题】:Sort list of nested dictionaries by multiple attributes按多个属性对嵌套字典列表进行排序
【发布时间】:2021-08-10 22:57:06
【问题描述】:

我的样本数据为

b = [{"id": 1, "name": {"d_name": "miranda", "ingredient": "orange"}, "score": 1.123},
 {"id": 20, "name": {"d_name": "limca", "ingredient": "lime"}, "score": 4.231},
 {"id": 3, "name": {"d_name": "coke", "ingredient": "water"}, "score": 4.231},
 {"id": 2, "name": {"d_name": "fanta", "ingredient": "water"}, "score": 4.231},
 {"id": 3, "name": {"d_name": "dew", "ingredient": "water & sugar"}, "score": 2.231}]

我需要对score ASC, name DESC, id ASC 进行排序(通过关系数据库表示法)。
到目前为止,我已经实现了

def sort_func(e):
    return (e['score'], e['name']['d_name'], e['id'])

a = b.sort(key=sort_func, reverse=False)

这适用于score ASC, name ASC, id ASC
但是对于score ASC, name DESC, id ASC,如果我尝试按name DESC 排序,则会引发错误。因为unary - error 中的-e['name']['d_name']

我该如何从这里解决这个问题?谢谢,

编辑 1: 我需要使这种动态化,以便可以出现e['name'['d_name'] ASC, e['name']['ingredient'] DESC 之类的情况。我该如何处理这种类型的动态行为?

【问题讨论】:

    标签: python list sorting dictionary


    【解决方案1】:

    您可以通过-scorename-idreverse=True 进行排序:

    from pprint import pprint
    
    
    b = [
        {
            "id": 1,
            "name": {"d_name": "miranda", "ingredient": "orange"},
            "score": 1.123,
        },
        {
            "id": 20,
            "name": {"d_name": "limca", "ingredient": "lime"},
            "score": 4.231,
        },
        {
            "id": 3,
            "name": {"d_name": "coke", "ingredient": "water"},
            "score": 4.231,
        },
        {
            "id": 2,
            "name": {"d_name": "fanta", "ingredient": "water"},
            "score": 4.231,
        },
        {
            "id": 3,
            "name": {"d_name": "dew", "ingredient": "water & sugar"},
            "score": 2.231,
        },
    ]
    
    pprint(
        sorted(
            b,
            key=lambda k: (-k["score"], k["name"]["d_name"], -k["id"]),
            reverse=True,
        )
    )
    

    打印:

    [{'id': 1,
      'name': {'d_name': 'miranda', 'ingredient': 'orange'},
      'score': 1.123},
     {'id': 3,
      'name': {'d_name': 'dew', 'ingredient': 'water & sugar'},
      'score': 2.231},
     {'id': 20, 'name': {'d_name': 'limca', 'ingredient': 'lime'}, 'score': 4.231},
     {'id': 2, 'name': {'d_name': 'fanta', 'ingredient': 'water'}, 'score': 4.231},
     {'id': 3, 'name': {'d_name': 'coke', 'ingredient': 'water'}, 'score': 4.231}]
    

    【讨论】:

    • 谢谢,@andrej,这适用于这种情况。我需要使这个动态,用户可以选择多个字符串值进行排序,e['name']['d_name'] ASC ,e['name']['ingredient'] DESC,如何解决这个问题?
    • @Ansuman 您可以分多个步骤进行排序:首先按分数 DESC 排序,然后按名称 ASC 排序,然后按 id DESC 排序。 Python 排序是稳定的,所以它可以工作。
    猜你喜欢
    • 2018-07-03
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多