根据嵌套值对字典列表进行排序

Sorting list of dictionaries based on nested value

我有以下数据:

[
    {
        "id": 2,
        "members": [
            {
                "id": 1,
                "username": "stefan",
                "email": "stefan@testmail.com"
            },
            {
                "id": 9,
                "username": "John",
                "email": "John@gmail.com"
            }
        ],
        "title": "Conversation 2",
        "messages": [
            {
                "message": "Conv 2 message 1",
                "created_on": "03.05.2022 17:00",
                "created_by": 1
            },
            {
                "message": "Conv 2 message 2",
                "created_on": "03.05.2022 17:00",
                "created_by": 9
            }
        ]
    },
    {
        "id": 1,
        "members": [
            {
                "id": 1,
                "username": "stefan",
                "email": "stefan@testmail.com"
            },
            {
                "id": 11,
                "username": "Sharon",
                "email": "sharon@testmail.com"
            }
        ],
        "title": "Conversation 1",
        "messages": [
            {
                "message": "Conv 1 message 1",
                "created_on": "03.05.2022 17:12",
                "created_by": 1
            },
            {
                "message": "Conv 1 message 2",
                "created_on": "03.05.2022 17:12",
                "created_by": 11
            },
        ]
    },

]

每个字典代表一个聊天对话,还包含属于每个聊天会话的所有消息的键。

我的目标是根据哪一个具有最新消息对会议列表进行排序(因此以某种方式基于“created_on”键)

也就是说,如果聊天 2 的最后一条聊天消息是 5 月 9 日下午 5 点,而聊天 1 的最后一条聊天消息是 5 月 9 日下午 3 点,我希望聊天 2 的词典位于列表的第一位

我一直在努力解决这个问题。我试过:

new_list = data.sort(key=lambda x: ( x['messages']['created_on']))

但这行不通,因为 messages 键的值是另一个列表,而且我认为基于这种字符串格式的日期排序也行不通。

非常感谢任何帮助

您需要调用max()获取每个列表中的最新聊天消息。

new_list = sorted(data, key=lambda x: max(msg['created_on'] for msg in x['messages']))

但是还有一个问题。您的日期字符串格式不正确,无法正确排序。您应该将它们更改为 YYYY-MM-DD 格式,或调用 datetime.strptime(msg['created_on'], '%d.%m.%Y %H:%M') 来解析它们。