Самый эффективный способ получить значения из словаря в набор
Кажется, я не могу понять, как записать следующее в одну строку кода, используя заданное понимание. Если это невозможно, есть ли более быстрый способ сделать то, что я пытаюсь сделать здесь? В основном просто получение всех значений словаря в набор. Некоторые значения могут быть пустым набором. Простой пример ниже
d = {1:set(),2:{1,2,3},3:{4}}
t = set()
for k, v in d.items():
if len(v) > 0:
t.update(v)
print(t)
выход
{1,2,3,4}
3 ответа
Самый простой это, вероятно,:
>>> set.union(*d.values())
{1, 2, 3, 4}
Там нет необходимости в специальном случае пустой набор значений. Сложение пустого набора в объединение не имеет значения для результата, и проверка на длину в коде Python заранее выполняется медленнее, чем просто set.union()
понять это.
С НАБОРОМ КОМПЛЕКСА
Вы также можете сделать это с заданным пониманием, но я ожидаю, что этот путь будет значительно медленнее (хотя я не рассчитал это):
>>> {x for oneset in d.values() for x in oneset}
{1, 2, 3, 4}
В качестве альтернативы union
вещь, которую вы могли бы использовать chain.from_iterable
:
from itertools import chain
d = {1:set(),2:{1,2,3},3:{4}}
set(chain.from_iterable(d.values()))
>>> {1, 2, 3, 4}
Ответы как Тима Питерса, так и Дждезы быстрее, чем использование заданного понимания, потому что они избегают явного двойного for
цикл работает на скорости Python. Но вот как это сделать с заданным пониманием:
d = {1:set(), 2:{1,2,3}, 3:{4}}
t = {v for u in d.values() for v in u}
print(t)
выход
{1, 2, 3, 4}