访问python词典中的最新年份

时间:2019-11-12 10:48:16

标签: python dictionary

我有一个看起来像这样的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)

但是我仍然有错误: ValueError: invalid literal for int() with base 10: '_id'这很有道理。

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

在此示例中,我想访问2018嵌套词典。

5 个答案:

答案 0 :(得分:3)

这是将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

答案 1 :(得分:0)

假设'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]

答案 2 :(得分:0)

自定义词典怎么样?

$('input[type=checkbox]').click(function(){
    $(this).each(function(){
        var nik = $(this).data("nik");
        var nama = $(this).data("nama");
        var rs = $(this).data("rs");
        var unit = $(this).data("unit");
        var jabatan = $(this).data("jabatan");

        if ($(this).is(':checked')) {
            $('#myTable').append('<tr><td>'+nik+'</td><td>'+nama+'</td><td>'+rs+'</td><td>'+unit+'</td><td>'+jabatan+'</td><td><button type="button" class="btn btn-danger btn-sm btnDelete">Delete</button></td></tr>');
        } else {
            $('#myTable').closest('tr').remove();
            // $("#myTable input[type=checkbox]:checked").closest("tr").remove();
        }
    });
});

演示:

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'

答案 3 :(得分:0)

最后,我想到了这个辅助函数:

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))

答案 4 :(得分:0)

在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'}}