简体   繁体   English

创建一个通过询问某些值来过滤嵌套字典的函数

[英]Creating a function that filters a nest dictionary by asking certain values

I am a beginner in python trying to create a function that filters through my nested dictionary through by asking multiple values in a dictionary like 我是python的初学者,尝试创建一个函数,该函数通过在字典中询问多个值(例如

filtered_options = {'a': 5, 'b': "Cloth'}

For my dictionary 对于我的字典

my_dict = {1.0:{'a': 1, 'b': "Food', 'c': 500, 'd': 'Yams'},
           2.0:{'a': 5, 'v': "Cloth', 'c': 210, 'd': 'Linen'}}

If I input my dictionary in the filter function with such options I should get something that looks like 如果我在带有此类选项的过滤器函数中输入字典,我应该会得到类似

filtered_dict(my_dict, filtered_options = {'a': 5, 'b': "Cloth'}) 

which outputs the 2nd key and other keys with the same filtered options in my dictionary. 在我的字典中输出第二个键和其他具有相同过滤选项的键。

This should do what you want. 这应该做您想要的。

def dict_matches(d, filters):
    return all(k in d and d[k] == v for k, v in filters.items())

def filter_dict(d, filters=None):
    filters = filters or {}
    return {k: v for k, v in d.items() if dict_matches(v, filters)}

Here's what happens when you test it: 测试时会发生以下情况:

>>> filters = {'a': 5, 'b': 'Cloth'}
>>> my_dict = {
...     1.0: {'a': 1, 'b': 'Food', 'c': 500, 'd': 'Yams'},
...     2.0: {'a': 5, 'b': 'Cloth', 'c': 210, 'd': 'Linen'}
... }
>>> filter_dict(my_dict, filters)
{2.0: {'b': 'Cloth', 'a': 5, 'd': 'Linen', 'c': 210}}

You can do this : 你可以这样做 :

import operator
from functools import reduce

def multi_level_indexing(nested_dict, key_list):
    """Multi level index a nested dictionary, nested_dict through a list of keys in dictionaries, key_list
    """
    return reduce(operator.getitem, key_list, nested_dict)

def filtered_dict(my_dict, filtered_options):
    return {k : v for k, v in my_dict.items() if all(multi_level_indexing(my_dict, [k,f_k]) == f_v for f_k, f_v in filtered_options.items())}

So that: 以便:

my_dict = {1.0:{'a': 1, 'b': 'Food', 'c': 500, 'd': 'Yams'},
           2.0:{'a': 5, 'b': 'Cloth', 'c': 210, 'd': 'Linen'}}

will give you: 会给你:

print(filtered_dict(my_dict, {'a': 5, 'b': 'Cloth'}))  
# prints {2.0: {'a': 5, 'b': 'Cloth', 'c': 210, 'd': 'Linen'}}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM