【问题标题】:Sort list of lists of dictionaries by datetime in python在python中按日期时间对字典列表进行排序
【发布时间】:2022-01-24 02:17:36
【问题描述】:

我想按图书的出版日期对 Google Books API 返回的图书列表进行排序。数据看起来像这样:

{
 "kind": "books#volumes",
 "totalItems": 506,
 "items": [
   {
  ...
     "volumeInfo": {
       "title": "RHYTHM OF WAR PART ONE",
       "authors": [
         "BRANDON SANDERSON"
       ],
       "publishedDate": "2023-03-16",
       "industryIdentifiers": [
         {
           "type": "ISBN_10",
           "identifier": "1473233372"
         },
   ...
   },

我尝试过的是首先将书籍隔离在一个新列表中,如下所示:

myList = myList["items"]

然后按日期时间对新列表进行排序。

myListSorted = sorted(myList, key=lambda d: datetime.datetime.strptime(d["volumeInfo"]["publishedDate"], '%Y-%m-%d'))

我收到以下错误消息:

myListSorted = sorted(myList, key=lambda d: datetime.datetime.strptime(d["publishedDate"]["volumeInfo"], '%Y-%m-%d'))

TypeError: list indices must be integers or slices, not str

我也尝试过使用itemgetter方法,但目前还没有成功。

API 调用的结果可以按发布日期排序,如下所示:

https://www.googleapis.com/books/v1/volumes?q=inauthor:brandon%20sanderson&orderBy=newest

但是我将几个调用的结果一起添加到一个列表中,并且希望能够按发行日期对所有书籍进行排序。

【问题讨论】:

  • 错误消息表明您正在索引的内容是列表而不是字典 - 即 d 或(如果错误实际上来自前一行)myList 不是您认为是或不是来自完全如图所示的数据。我的猜测是您分配myList 的方式有问题,此代码sn-p 并非完全错误,但它很可疑:myList = myList["items"]。为了清楚起见,我通常会给仅项目列表一个新名称,例如volumes = myList["items"]

标签: python sorting datetime


【解决方案1】:

我发现了你的问题!

在您的第二个 myListSorted 语句中,您的字典参数出现错误!

试试这个:

myListSorted = sorted(myList, key=lambda d: datetime.datetime.strptime(d["volumeInfo"]["publishedDate"], '%Y-%m-%d'))

【讨论】:

  • 谢谢。当它不起作用时,我试图切换参数,并且不小心复制了错误消息以便更早地执行代码。从那以后,我发现我的代码的不同点出了问题。
  • @MD,没问题!很高兴你知道了!
【解决方案2】:

问题必须在您的代码中的其他地方,因为这与您所说的一样,但没有问题:

from json import load
from urllib.request import urlopen
from datetime import datetime

with urlopen('https://www.googleapis.com/books/v1/volumes?q=inauthor:brandon%20sanderson&orderBy=newest') as r:
    data = load(r)
    items = data['items']
    sorted_items = sorted(items, key=lambda d: datetime.strptime(d["volumeInfo"]["publishedDate"], '%Y-%m-%d'))

print(sorted_items)

如果您仍有问题,请提供一个最小的、可重现的示例。

【讨论】:

  • 感谢您指出这一点。我一直错误地将 API 调用的结果加在一起。现在我收到 ValueError: time data '2021' does not match format '%Y-%m-%d' 所以我将研究处理不具有我指定格式的值。
猜你喜欢
  • 2014-06-10
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多