Объединение нескольких наборов в список

Это мой код.

s = set()
for x in [ {1,2}, {3,4}, {5,1} ]:
    s |= x

Возвращает set([1, 2, 3, 4, 5]).

Можно ли в таком случае использовать понимание множества? Как мне написать короче?


person ndsvw    schedule 13.04.2018    source источник


Ответы (2)


set.union

set.union(*[{1,2}, {3,4}, {5,1}])
# {1, 2, 3, 4, 5}

Зачем вообще нужна петля? Используйте set.union, он позволяет вычислять объединение более двух наборов (контейнеров) за раз. Я говорю контейнеры, потому что второй (и последующие) аргументы вообще не нужно устанавливать.

set.union(*[{1,2}, [3,4], [5,1]])
# {1, 2, 3, 4, 5}

Однако первое должно быть. В качестве альтернативы,

set().union(*[[1,2], [3,4], [5,1]])
# {1, 2, 3, 4, 5}

При вызове union для заданного объекта (а не класса) ни один из аргументов не должен быть установлен.


functools.reduce

from functools import reduce

reduce(set.union, [{1,2}, {3,4}, {5,1}])
# {1, 2, 3, 4, 5}

Выполняется попарное сокращение с накоплением результата. Однако не так хорошо, как первый вариант.

person cs95    schedule 13.04.2018
comment
Вместо {1, 2}.union(*[[3,4], [5,1]]) вы также можете использовать set().union(*[{1,2}, [3,4], [5,1]]). - person Aran-Fey; 13.04.2018

Если вы действительно хотите установить здесь понимание:

lst = [{1,2}, {3,4}, {5,1}]
{elem for set_ in lst for elem in set_}
person internet_user    schedule 13.04.2018