我有以下数据:
[
{
"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
},
]
},
]
每个字典代表一个聊天会话,并且还包含属于每个聊天会话的所有消息的键。
我的目标是根据具有最新消息的convos列表进行排序(因此基于"created_on")关键在某种程度上)
例如,如果聊天2的最后一条聊天消息是5月9日下午5点,而聊天1的最后一条聊天消息是5月9日下午3点,我希望聊天2的字典位于列表的第一个
我一直在努力弄清楚这个问题。我试过:
new_list = data.sort(key=lambda x: ( x['messages']['created_on']))
但这不起作用,因为消息键的值是另一个列表,而且我认为基于此字符串格式的日期排序也不起作用。
感谢您的帮助
您需要调用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')
来解析它们。