Python使用嵌套列表对字典列表排序

6jjcrrmo  于 2023-10-14  发布在  Python
关注(0)|答案(2)|浏览(111)

我有一个字典列表(消息线程),其中包含另一个字典列表(消息),我需要按最新消息的日期排序线程。
数据是什么样的

[
    {key:thread1,
     messages:[
                {key:message1,
                 date:10/10/2023
                 }
                 /// older messages
              ]
    },
    {key:thread2,
     messages: [
                 {key:message4,
                  date:10/13/2023
                  },
                  ///older messages
               ]
      }
]

我需要对它进行排序,以便列表中的第一个线程是线程2,它具有与线程1相对的最新消息,消息已经正确排序。

new9mtju

new9mtju1#

方法

创建一个函数,使用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

输出

结果是thread2是第一个

[{'key': 'thread2', 'messages': [{'key': 'message4', 'date': '10/13/2023'}]}, {'key': 'thread1', 'messages': [{'key': 'message1', 'date': '10/10/2023'}]}]
bt1cpqcv

bt1cpqcv2#

使用一个结构为threads的数组,可以像这样获得包含最新消息的线程:

max(threads,key=lambda x: max(m["date"] for m in x["messages"]))

注意这些日期参数的格式。如果它们是格式为月/日/年的字符串,max将不会可靠地返回最近的日期。对此的一种解决方法是在执行操作之前将日期参数强制转换为日期时间对象。

相关问题