过滤多级字典的字典键

时间:2017-04-26 19:59:38

标签: python dictionary filter

我有以下dict结构:

{12345: {2006: [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 1, 'b': 5}]}, 12346: {2007: [{'a': 2, 'b': 7}, {'a': 1, 'b': 9}, {'a': 1, 'b': 12}]}}

我希望能够根据'a''b'

的键进行过滤

例如,如果'a' is 1我的过滤后的dict看起来像是:

{12345: {2006: [{'a': 1, 'b': 2}, {'a': 1, 'b': 5}]}, 12346: {2007: [{'a': 1, 'b': 9}, {'a': 1, 'b': 12}]}}

我有以下for循环让我进入我想要的内部dict's的位置,但我不知道如何将它放回到同一结构的dict中。 / p>

    d = {12345: {2006: [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}, {'a': 1, 'b': 5}]}, 12346: {2007: [{'a': 2, 'b': 7}, {'a': 1, 'b': 9}, {'a': 1, 'b': 12}]}}

    d_filter = {}
    for item_code in d.keys():
        for year in d[item_code]:
            for item_dict in d[item_code][year]:
                if item_dict['a'] == 1:
                    print(item_dict)  # how to put this back in d_filter?
制造

{'a': 1, 'b': 2}
{'a': 1, 'b': 5}
{'a': 1, 'b': 9}
{'a': 1, 'b': 12}

我猜有一种更好的方法来过滤我无法找到的东西,或者一些字典理解的东西,我的小思想无法掌握。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

这是词典理解就是这样做的; dct是您的初始词典:

d = {k: {ky: [d for d in vl if d['a']==1] for ky, vl in v.items()} 
                                          for k, v in dct.items()}
print d
# {12345: {2006: [{'a': 1, 'b': 2}, {'a': 1, 'b': 5}]}, 12346: {2007: [{'a': 1, 'b': 9}, {'a': 1, 'b': 12}]}}

您可以将内置过滤器(即d['a']==1)更改为您选择的词典和/或值。

答案 1 :(得分:1)

你可以这样做:

filtered = {
     item_code: {
         year: [item for item in items if item['a'] == 1]
         for year, items in years.items()
     } 
     for item_code, years in d.items()
}

结果是:

{12345: {2006: [{'a': 1, 'b': 2}, {'a': 1, 'b': 5}]},
 12346: {2007: [{'a': 1, 'b': 9}, {'a': 1, 'b': 12}]}}