Самый эффективный способ получить значения из словаря в набор

Кажется, я не могу понять, как записать следующее в одну строку кода, используя заданное понимание. Если это невозможно, есть ли более быстрый способ сделать то, что я пытаюсь сделать здесь? В основном просто получение всех значений словаря в набор. Некоторые значения могут быть пустым набором. Простой пример ниже

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}
Другие вопросы по тегам