Если исходный словарь является фиксированным, и в качестве входных данных для функции принимается только listA
, то вы должны изменить словарь, чтобы он содержал наборы вместо списков. Наборы быстрее проверяют членство, поэтому они быстрее тестируют подмножества из; это можно сделать с помощью перегруженного оператора <=
, что также делает код чище.
dict_of_lists = {
"A": ["a", "b", "c"],
"B": ["b", "d", "e"],
"C": ["a", "e"]
}
dict_of_sets = { k: set(v) for k, v in dict_of_lists.items() }
def func(listA):
setA = set(listA)
return { k: v for k, v in dict_of_lists.items() if dict_of_sets[k] <= setA }
Пример:
>>> func(['a', 'b', 'c', 'e'])
{'A': ['a', 'b', 'c'], 'C': ['a', 'e']}
Также подумайте, имеет ли это смысл для ваших входных данных и выводит использование наборов вместо списков. Если вам действительно не нужно поддерживать порядок или разрешать дубликаты, тогда вы можете просто использовать dict_of_sets
, и func
также не нужно будет преобразовывать список в набор:
dict_of_sets = {
"A": {"a", "b", "c"},
"B": {"b", "d", "e"},
"C": {"a", "e"}
}
def func(setA):
return { k: v for k, v in dict_of_sets.items() if v <= setA }