Python 检索字典中最后一个键的值
我试图从返回JSON对象的API中提取财务数据。API没有明确声明返回的字典是OrderedDicts,但是输出总是排序的,因此我假设它是 我需要检索字典中最后一个键的值,因为我需要最新的财务数据。但是,我无法明确使用密钥的名称来提取它,因为它是日期格式的,并且可能会根据使用查询的公司的不同而有所不同 我尝试将dictionary对象转换为列表,并使用索引-1选择最后一个键,但是转换过程似乎会随机化字典的顺序,不再检索最后一个日期 那么,我该如何检索字典中最后一个键的值呢 下面是一个JSON对象的示例:Python 检索字典中最后一个键的值,python,sorting,dictionary,key,key-value,Python,Sorting,Dictionary,Key,Key Value,我试图从返回JSON对象的API中提取财务数据。API没有明确声明返回的字典是OrderedDicts,但是输出总是排序的,因此我假设它是 我需要检索字典中最后一个键的值,因为我需要最新的财务数据。但是,我无法明确使用密钥的名称来提取它,因为它是日期格式的,并且可能会根据使用查询的公司的不同而有所不同 我尝试将dictionary对象转换为列表,并使用索引-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}
重新考虑这个问题后,我意识到,由于日期的格式是可以正确地作为字符串进行比较的,所以您可以只执行
k,v=max(data.items())
,但是如果您(或其他人查看此线程)使用的日期格式与我的原始答案不一样,则可以执行以下操作
您只需使用
max
builtin来比较字典的键,以确保它们都作为日期和时间进行比较。您可以使用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
重新考虑这个问题后,我意识到,由于日期的格式是可以正确地作为字符串进行比较的,所以您可以只执行
k,v=max(data.items())
,但是如果您(或其他人查看此线程)使用的日期格式与我的原始答案不一样,则可以执行以下操作
您只需使用
max
builtin来比较字典的键,以确保它们都作为日期和时间进行比较。您可以使用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
通常,如果API没有指定它实际执行的操作,则不应依赖它继续执行该操作。如果所有键都具有可比性,则最高值将是最新的,因此您可以使用
max(data.keys())
来获取最新的键,根据格式的不同,您可能需要指定一个键=…
,以将日期转换为可以正确比较的格式。您可以将日期字符串转换为实际的日期时间
对象,对其进行排序,并获得最大的一个。您不能依赖API的行为,因为它可能会在将来发生变化。只需通过将键转换为datetime
对象来对字典进行排序。即使API返回的JSON已排序,但一旦通过JSON解析器运行,它也将不再排序。您可以让我们将键解析为时间,然后根据这些时间进行排序。通常,如果API没有指定它实际执行的操作,您不应该依赖它继续执行该操作。如果所有键都具有可比性,那么最高的键将是最新的键,因此您可以使用max(data.keys())
来获取最新的键,根据格式的不同,您可能需要指定一个键=…
,以将日期转换为可以正确比较的格式。您可以将日期字符串转换为实际的日期时间
对象,对其进行排序,并获得最大的一个。您不能依赖API的行为,因为它可能会在将来发生变化。只需通过将键转换为datetime
对象来对字典进行排序。即使API返回的JSON已排序,但一旦通过JSON解析器运行,它也将不再排序。您可以将键解析为时间,然后根据这些时间进行排序。实际上,max(data.items(),key=…)
更像是OP想要检索与键关联的值。请确保,converter
采用元组而不是时间戳。编写converter函数似乎更简单,只需处理键,然后只获取value=data[highest]
,但绝对可以让它以这种方式处理。这很有意义。顺便说一句,你不需要.keys()
。这仅仅是OP如何解决问题的三行摘要,我们不要深入到微观优化。我想要的是清晰和精确,所以我想让答案保持原样,但如果OP(或任何其他人)对进一步的优化/选项感兴趣,那么我想你的评论对他们会很有用。这种格式的一个主要特点是,从一年到几秒钟,你不需要解析它,只需要比较字符串就可以了吗?请参见。实际上,max(data.items(),key=…)
更像它,因为OP希望检索与该键相关的值。请确保,converter
采用元组而不是时间戳。编写converter函数似乎更简单,只需处理键,然后只获取value=data[highest]
,但绝对可以让它以这种方式处理。这很有意义。顺便说一句,你不需要.keys()
。这仅仅是OP如何解决问题的三行摘要,我们不要深入到微观优化。我想要的是清晰和精确,所以我想让答案保持原样,但如果OP(或任何其他人)对进一步的优化/选项感兴趣,那么我想你的评论对他们会很有用。这种格式的一个主要特点是,从一年到几秒钟,你不需要解析它,只需要比较字符串就可以了吗?看见