Создание функции, которая фильтрует гнездовой словарь, задавая определенные значения - PullRequest
0 голосов
/ 08 ноября 2018

Я новичок в Python, пытаюсь создать функцию, которая фильтрует мой вложенный словарь, запрашивая несколько значений в словаре, например

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

Для моего словаря

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

Если я введу свой словарь в функцию фильтра с такими параметрами, я должен получить что-то похожее на

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

, который выводит 2-й ключ и другие ключи с такими же отфильтрованными параметрами в моем словаре.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Это должно делать то, что вы хотите.

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

Вот что происходит, когда вы проверяете это:

>>> 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}}
0 голосов
/ 08 ноября 2018

Вы можете сделать это:

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

Так что:

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

даст вам:

print(filtered_dict(my_dict, {'a': 5, 'b': 'Cloth'}))  
# prints {2.0: {'a': 5, 'b': 'Cloth', 'c': 210, 'd': 'Linen'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...