如何使用嵌套列表对字典列表进行排序

问题描述 投票:0回答:2

我有一个字典列表(消息线程),其中包含另一个字典列表(消息)。我需要按最新消息的日期对线程进行排序。

数据是什么样的:

[
    {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 list dictionary sorting
2个回答
2
投票

接近

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

0
投票

使用您描述为

threads
的结构数组,可以像这样获取包含最新消息的线程:

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

请小心这些日期参数的格式。如果它们是格式为月/日/年的字符串,

max
将无法可靠地返回最近的日期。解决此问题的一种方法是在执行操作之前将日期参数转换为日期时间对象。

© www.soinside.com 2019 - 2024. All rights reserved.