访问python字典中的最近一年



我有一个python字典,看起来像这样:

test_dict = {'id': '00000001',
'2017': {'some_info': 'toast'},
'2018': {'some_more_info': 'bread'},
}

我想了解最近一年的情况,但最近一年每次都可能发生变化。

如果可能的话,我尝试过将每个键转换为整数("id"显然不会转换为整数(,使用:

new_d = {}
for k,v in test_dict.items():
try:
new_d[int(k)] = v
except ValueError:
new_d[k] = v

然后试图找到最大密钥:

max(new_d, key=int)

但我仍然有错误:CCD_ 1,这是有意义的。

我想在字典中搜索所有整数键的最大值键。

在这个例子中,我想访问2018嵌套字典。

这是一种使用带有自定义键的max的方法。

例如:

test_dict = {'id': '00000001',
'2017': {'some_info': 'toast'},
'2018': {'some_more_info': 'bread'},
}
print(max(test_dict.items(), key=lambda x: int(x[0]) if x[0].isdigit() else False))
#or
print(max(test_dict, key=lambda x: int(x) if x.isdigit() else False))

输出:

('2018', {'some_more_info': 'bread'})
2018

定制字典怎么样?

from collections import UserDict
class YearDict(UserDict):
def most_recent(self):
ints = (key for key in self if key.isdigit())
return max(ints, key=int)

演示:

>>> test_dict = {'id': '00000001', 
...:              '2017': {'some_info': 'toast'}, 
...:              '2018': {'some_more_info': 'bread'}, 
...:            }                                                               
>>>                                                                             
>>> yd = YearDict(test_dict)                                                    
>>> yd.most_recent()                                                            
'2018'

根据您的用例,当dict中没有年份时,您可能需要添加额外的方法和健全性检查。

此外,考虑使密钥为整数,并相应地简化most_recent

最后我想出了这个助手函数:

def helper_max_year(dictionary_of_comp):
new_d = {}
for k,v in dictionary_of_comp.items():
try:
new_d[int(k)] = v
except ValueError:
new_d[k] = v
integer_keys = [key for key in new_d.keys() if type(key) == int]
return (max(integer_keys))

假设'id'是唯一的非数值,那么只要您只通过4位数的年份,就可以使用max在字符串上按预期工作的事实:

test_dict[max(x for x in test_dict if x != 'id')]

或者如果你喜欢Python的函数式编程原语,

test_dict[max(filter(partial(str.__ne__, 'id'), test_dict))]

或者,在您给定的示例中,兴趣值是最后一个。如果你可以假设总是这样,你可以利用Python字典是有序的(从Python 3.7开始(,只需进行

list(test_dict.items())[-1]

在O(N(时间内,维护一个变量以保存当前最长年份直到当前迭代器,并循环通过该

test_dict = {'id': '00000001',
'2017': {'some_info': 'toast'},
'2018': {'some_more_info': 'bread'},
}
def func(data):
max_year= -10000
for k, v in data.items():
if k.isdigit() and int(k)>max_year:
max_year = int(k)
return {str(max_year): data[str(max_year)]}

print(func(test_dict))

输出

{'2018': {'some_more_info': 'bread'}}

相关内容

最新更新