Получить один "заданный" объект из списка значений, присутствующих в словаре
Я пытаюсь построить набор из значений словаря. Каждое значение словаря представляет собой список строк.
{'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