基于特定值的Python对大字典的过滤

时间:2014-02-20 12:05:58

标签: python dictionary

我有一本非常大的字典。这是我的字典的一小部分:

dictionary = {'1': {'a':'aa','b':'bb','c':'cc','d':'dd'}, 
              '2': {'a':'aa','b':'bb','c':'cc','d':'dd'}, 
              '3': {'a':'aa','b':'bb','c':'cc','d':'dd'} }

我只想过滤掉a& C。

期望的输出:

dictionary = { '1': {'a':'aa','c':'cc'}, 
               '2': {'a':'aa','c':'cc'}, 
               '3': {'a':'aa','c':'cc'} }

1 个答案:

答案 0 :(得分:2)

字典理解拯救:

{k: {'a': v['a'], 'c': v['c']} for k, v in dictionary.iteritems()}

这假定所有字典都设置了这些键并且您使用的是Python 2.7。

更通用的版本:

def filtered_dicts(d, keys):
    return {k: {vk: v[vk] for vk in v.viewkeys() & keys} for k, v in d.iteritems()}

dictionary = filtered_dicts(dictionary, {'a', 'c'})

即使dictionary的所有值中都没有键,这也会有效。

任何可迭代都将在keys处执行;我在这里使用了set字面值,但列表或元组甚至字符串也可以使用。

后者的Python 3版本:

def filtered_dicts(d, keys):
    return {k: {vk: v[vk] for vk in v.keys() & keys} for k, v in d.items()}

使用Python 3进行快速演示:

>>> dictionary = {'1': {'a':'aa','b':'bb','c':'cc','d':'dd'}, '2': {'a':'aa','b':'bb','c':'cc','d':'dd'}, '3':{'a':'aa','b':'bb','c':'cc','d':'dd'}}
>>> def filtered_dicts(d, keys):
...     return {k: {vk: v[vk] for vk in v.keys() & keys} for k, v in d.items()}
... 
>>> filtered_dicts(dictionary, {'a', 'c'})
{'3': {'c': 'cc', 'a': 'aa'}, '2': {'c': 'cc', 'a': 'aa'}, '1': {'c': 'cc', 'a': 'aa'}}