我有一个字典列表(消息线程),其中包含另一个字典列表(消息)。我需要按最新消息的日期对线程进行排序。
数据是什么样的:
[
{key:thread1,
messages:[
{key:message1,
date:10/10/2023
}
/// older messages
]
},
{key:thread2,
messages: [
{key:message4,
date:10/13/2023
},
///older messages
]
}
]
我需要对其进行排序,以便列表中的第一个线程 2 具有最新消息,与线程 1 不同,消息已经正确排序。
接近
创建一个函数,使用 Python Sorted 函数通过键函数按相反顺序对列表进行排序
代码
from datetime import datetime # will use strptime in datetime to convert date string to date object
def sort_by_date(lst):
' function to sort by the date of the first message in the list '
# d['messages'][0]['date'] is the date of first message in list
# use datetime.strptime to convert string to datetime object for sorting
return sorted(lst, key = lambda d: datetime.strptime(d['messages'][0]['date'], "%m/%d/%Y"),
reverse = True)
用法
# List to sort
lst = [
{'key':'thread1',
'messages':[
{'key':'message1',
'date':'10/10/2023'
}
# older messages
]
},
{'key':'thread2',
'messages': [
{'key':'message4',
'date':'10/13/2023'
},
# older messages
]
}
]
print(sort_by_date(lst)) # Use function sort_by_date defined above
输出
结果是线程2是第一个
[{'key': 'thread2', 'messages': [{'key': 'message4', 'date': '10/13/2023'}]}, {'key': 'thread1', 'messages': [{'key': 'message1', 'date': '10/10/2023'}]}]
使用您描述为
threads
的结构数组,可以像这样获取包含最新消息的线程:
max(threads,key=lambda x: max(m["date"] for m in x["messages"]))
请小心这些日期参数的格式。如果它们是格式为月/日/年的字符串,
max
将无法可靠地返回最近的日期。解决此问题的一种方法是在执行操作之前将日期参数转换为日期时间对象。