【问题标题】:Retrieve value of last key in dictionary检索字典中最后一个键的值
【发布时间】:2025-12-18 19:45:01
【问题描述】:

我正在尝试从返回 JSON 对象的 API 中提取财务数据。 API 没有明确声明返回的字典是 OrderedDicts 但是输出总是排序的,因此我将假设它是。

我需要检索字典中最后一个键的值,因为我需要最新的财务数据。但是,我不能明确使用密钥的名称来提取它,因为它是日期格式,并且可能会因使用查询的公司而异。

我尝试将字典对象转换为列表并使用 -1 的索引选择最后一个键,但是转换过程似乎随机化了字典的顺序,不再检索最后一个日期。

那么我将如何检索字典中最后一个键的值?

以下是 JSON 对象的示例:

{'2007-06-01T00:00:00': 21.19,
 '2008-06-01T00:00:00': 26.01,
  '2009-06-01T00:00:00': 19.34,
  '2010-06-01T00:00:00': 22.88,
  '2011-06-01T00:00:00': 23.77,
  '2012-06-01T00:00:00': 14.77,
  '2013-06-01T00:00:00': 16.58,
  '2014-06-01T00:00:00': 14.02,
  '2015-06-01T00:00:00': 7.0,
  '2016-06-01T00:00:00': 9.08} 

【问题讨论】:

  • 通常,如果 API 未指定它实际执行的操作,您不应依赖它继续执行此操作。
  • 如果所有键都是可比较的,那么最高的将是最新的,因此您使用max(data.keys()) 来获取最新的键,具体取决于您可能需要指定key=... 的格式来放置将日期转换为可以正确比较的格式。
  • 您可以将日期字符串转换为实际的datetime 对象,对它们进行排序,然后得到最大的。
  • 您不能依赖 API 的行为,因为它可能在未来发生变化。只需将键转换为datetime 对象即可对字典进行排序。
  • 即使API返回的JSON是有序的,一旦你通过JSON解析器运行它,它就不再是有序的了。您也许可以通过strptime 将键解析为时间,然后根据这些时间进行排序。

标签: python sorting dictionary key key-value


【解决方案1】:

在重新考虑问题后,我意识到由于日期的格式可以正确地与字符串进行比较,因此您可以执行 k,v = max(data.items()) 但是如果您(或其他查看此线程的人)使用的日期格式不不像我原来的答案那样工作。


您可以简单地使用 max 内置来比较字典的键,以确保它们都作为日期和时间进行比较,您可以使用 key 参数将它们作为日期时间对象进行比较:

import datetime

data = {'2007-06-01T00:00:00': 21.19,
 '2008-06-01T00:00:00': 26.01,
  '2009-06-01T00:00:00': 19.34,
  '2010-06-01T00:00:00': 22.88,
  '2011-06-01T00:00:00': 23.77,
  '2012-06-01T00:00:00': 14.77,
  '2013-06-01T00:00:00': 16.58,
  '2014-06-01T00:00:00': 14.02,
  '2015-06-01T00:00:00': 7.0,
  '2016-06-01T00:00:00': 9.08}

def converter(timestamp):
    return datetime.datetime.strptime(timestamp, "%Y-%m-%dT%H:%M:%S")

highest = max(data.keys(),key=converter)

print(highest) #2016-06-01T00:00:00

【讨论】:

  • 其实max(data.items(), key=...) 更像是 OP 想要检索与键关联的值。确保converter 采用元组而不是时间戳。
  • 编写转换器函数似乎更简单,只处理密钥然后获取value = data[highest],但绝对你也可以让它处理它。
  • 有道理。顺便说一句,你不需要.keys()
  • 这只是三行作为 OP 如何解决他们的问题的摘要,让我们不要在微优化方面走得太远。我想要清晰准确,所以我想保留答案,但如果 OP(或其他任何人)对进一步的优化/选项感兴趣,那么我想你的 cmets 将对他们有用。
  • 从一年到几秒的格式的一个主要点不是您不必解析它但可以比较字符串吗?见the first item here
最近更新 更多