我有一个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'}}