Как гибко задавать критерии в функции поиска?
Есть небольшая функция которая возвращает нужный объект из словаря с указанными критериями, как можно модернизировать её так, чтобы можно было указывать критерии а-ля if 1 in list(): То-есть проверку есть ли элемент в нужном значении словаря в нашем случае список, ничего не приходит в голову, подскажите примеры.
def dict_parse(data, give_key=False, **keys):
"""Функция возвращает нужный объект из словаря с указанными критериями"""
ki = keys.items()
for i in data:
dt = data[i]
if all((dt[k] == v) for (k, v) in ki):
if give_key:
return i, dt
return dt
if give_key:
return None, None
return None
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Как предложил insolor:
def dict_find(data, predicate_fn, give_key=False):
for k, v in data.items():
if predicate_fn(k, v):
if give_key:
return k, v
return v
if give_key:
return None, None
return None
Теперь можно использовать с любым предикатом:
dict_find(data, lambda key, val: val['a'] == 'b') # значение с элементом
dict_find(data, lambda key, _: key == 'by-key') # значение по ключу
dict_find(data, lambda _, val: 1 in val) # значение с единицей
Можно заготовить предикаты и связки:
def by_key(key):
return lambda k, _: k == key
def in_list(val):
return lambda _, v: isinstance(v, list) and val in v
def all_of(*predicates):
return lambda k, v: all(p(k, v) for p in predicates)
И использовать:
d = {'a': 'b', 'b': [1, 2, 3]}
print(dict_find(d, by_key('a')))
print(dict_find(d, in_list(3)))
print(dict_find(d, all_of(by_key('b'), in_list(3))))