2017-04-26 173 views
0

的过滤字典键我有以下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' is 1在我的过滤dict'a''b'

例如键过滤看起来像:

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

我有以下循环获取我到那里我有内部dict's我想,但我不知道如何把它放回相同结构的dict

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} 

我猜有一个更好的方式来筛选我找不到,或者用字典的理解,我的小心思无法把握的东西。

任何帮助,将不胜感激。

+0

什么的'd_filter'预期的结果? –

回答

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

你可以做这样的事情:

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}]}} 
+0

这也适用,但我想我只能选择一个答案 –