Получить один "заданный" объект из списка значений, присутствующих в словаре

Я пытаюсь построить набор из значений словаря. Каждое значение словаря представляет собой список строк.

{'a': ['a','b','c'],'b':['a','b','d'],...}

Я пытаюсь использовать .update(x) объединить набор, содержащий значения из словаря. У меня уже есть успех со стандартным циклом for:

ingredientSet = set()
for values in recipes.values():
    ingredientSet.update(values)

То, что я хотел бы сделать, если это возможно, это сделать это в определенном понимании. Пока у меня есть это:

ingredientSet = { ingredientSet.update(x) for x in recipes.values() }

но моя IDE выдает ошибку, что перед его назначением ссылается на "componentSet".

Можно ли использовать .update(x) в понимании, или есть ли другой способ объединения предметов в набор в понимании?

2 ответа

Решение

Если вы хотите понимания, вы можете сделать это с двумя forэто как:

Код:

values_set = {item for items in data.values() for item in items}

Тестовый код:

data = {'a': ['a','b','c'],'b':['a','b','d']}

values_set = {item for items in data.values() for item in items}
print(values_set)

Результат:

{'d', 'b', 'c', 'a'}

Вот функциональный способ добиться этого с помощью itertools.chain.from_iterable(...):

>>> from itertools import chain
>>> my_dict = {'a': ['a','b','c'],'b':['a','b','d']}

>>> set(chain.from_iterable(my_dict.values()))
{'a', 'b', 'c', 'd'}

Кроме того, добавив здесь ответ от Jonsharpe из комментария, используя set().union(...):

>>> set().union(*my_dict.values())
{'a', 'b', 'd', 'c'}

Сравнение производительности

Ниже timeit Сравнение всех ответов на Python3:

  • С помощью itertools.chain.from_iterable - 0,558 мкц за цикл

    mquadri$ python3 -m timeit -s "from itertools import chain; my_dict = {'a': ['a','b','c'],'b':['a','b','d']}" "set(chain.from_iterable(my_dict.values()))"
    1000000 loops, best of 3: 0.558 usec per loop
    
  • Использование заданного понимания - 0,585 мксек за цикл

    mquadri$ python3 -m timeit -s "from itertools import chain; my_dict = {'a': ['a','b','c'],'b':['a','b','d']}" "{item for items in my_dict.values() for item in items}"
    1000000 loops, best of 3: 0.585 usec per loop
    
  • С помощью set().union(...) - 0,614 мксек за цикл

    mquadri$ python3 -m timeit -s "from itertools import chain; my_dict = {'a': ['a','b','c'],'b':['a','b','d']}" "set().union(*my_dict.values())"
    1000000 loops, best of 3: 0.614 usec per loop
    
Другие вопросы по тегам