Почему set (). Union (* list1) дает мне объединение двух списков внутри списка? - PullRequest
3 голосов
/ 09 мая 2019

Я выполняю задание, которое требует от меня прохождения кода.Я хотел бы получить краткое описание того, как set (). Union (* list1) работает, чтобы я мог ответить во время моего пошагового руководства.

list1 = [[1,2,3],[1,2,3,5,8]]

x = set().union(*list1)

print(list(x))



#output = [1, 2, 3, 5, 8]

1 Ответ

3 голосов
/ 09 мая 2019

Из документов: https://docs.python.org/3/library/stdtypes.html#frozenset.union

союз (* другие)
набор |другое |...
Возвращает новый набор с элементами из набора и всеми другими.

Также *list называется распаковкой списка, где мы получаем два подсписка внутри списка

In [37]: list1 = [[1,2,3],[1,2,3,5,8]]                                                                                         

In [38]: print(*list1)                                                                                                         
[1, 2, 3] [1, 2, 3, 5, 8]

Таким образом, код, который вы запустили, по существу создает объединение всех подсписков в списке x, и поскольку вы знаете, что объединение множеств [1,2,3] и [1,2,3,5,8] равно [1,2,3,5,8], отсюда и ожидаемый результат.

Обратите внимание, что это эквивалентно list(set([1,2,3]).union(set([1,2,3,5,8]))), где мы делаем a.union(b), a и b будучи наборами

In [31]: list1 = [[1,2,3],[1,2,3,5,8]] 
    ...:  
    ...: x = set().union(*list1)                                                                                               

In [32]: print(list(x))                                                                                                        
[1, 2, 3, 5, 8]

In [33]: print(list(set([1,2,3]).union(set([1,2,3,5,8]))))                                                                     
[1, 2, 3, 5, 8]

Добавление к этому, лучший подход кdo union или даже intersection может быть для преобразования списка списков в список наборов, используя map(set,list1), разворачивая наборы, а затем выполняя операции

In [39]: list1 = [[1,2,3],[1,2,3,5,8]]                                                                                         

In [40]: print(set.intersection(*map(set,list1)))                                                                              
{1, 2, 3}

In [41]: print(set.union(*map(set,list1)))                                                                                     
{1, 2, 3, 5, 8}
...