Как вернуть dict со списками в качестве значений, но он возвращает только ключи - PullRequest
1 голос
/ 10 февраля 2020

У меня есть dict1, который выглядит следующим образом:

{"A":["a","b","c"],"B":["b","d","e"],"C":["a","e"]}

Моя цель - написать функцию, которая получает listA в качестве входных данных. listA может быть ["a", "b", "c", "e"], например. Теперь я хочу вернуть dict2 со всеми элементами из dict1, у которых все их элементы включены в список A.

Вывод должен выглядеть следующим образом:

{'A':["a","b","c"],"C":["a","e"]}

Мой код выглядит так:

def func(listA: list) -> dict:
    return set(x for x in dict1 if all(x in listA for x in dict1[x]))

Мой вывод возвращает только ключи, что мне делать?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2020
dict1 = {"A":["a","b","c"],"B":["b","d","e"],"C":["a","e"]}
listA =  ["a","b","c","e"]
dict2 = {key: l for key, l in dict1.items() if all(val in listA for val in l)}
1 голос
/ 10 февраля 2020

Если исходный словарь является фиксированным, и в качестве входных данных для функции принимается только 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 }
0 голосов
/ 10 февраля 2020

вместо

dict1[x]

use`

dict1.values[x]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...