根据嵌套值对字典列表进行排序
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')
来解析它们。
我有以下数据:
[
{
"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')
来解析它们。