Получить один «заданный» объект из списка значений, присутствующих в словаре - PullRequest
0 голосов
/ 03 июня 2018

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

{'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 ]

0 голосов
/ 04 июня 2018

Вот функциональный способ добиться этого, используя 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'}

Кроме того, добавив сюда ответ *1000* jonsharpe's откомментарий с использованием 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
    
0 голосов
/ 03 июня 2018

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

Код:

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'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...