Как вывести булевы множества в Python?

Мне нужно вывести булевы множества вот такого множества:

set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

На всякий случай:

Булевы множества в дискретной математике - это множество всех подмножеств данного множества.

Так, для множества set2 = {1, 2, 3}, булево множество будет таким:

set2_bool = {{1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}, {}}

Ответы (2 шт):

Автор решения: Павел

Для этого можно воспользоваться модулем itertools и его встроенными функциями chain и combinations:

from itertools import chain, combinations


def powerset(iterable):
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s) + 1))

print(list(powerset({1, 2, 3})))  # -> [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

Либо вот так:

print(list(map(set, powerset({1, 2, 3}))))  # -> [set(), {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}]

Оригинал вопроса

→ Ссылка
Автор решения: MarianD

Применим функцию powerset() из модуля more_itertools:

from more_itertools import powerset                         # pip install more-itertools

set2_bool = {frozenset(tuple_) for tuple_ in powerset(set2)}

Результат (в переменной set2_bool) для множества set2 = {1, 2, 3}:

{frozenset(),
 frozenset({2}),
 frozenset({2, 3}),
 frozenset({1}),
 frozenset({1, 2}),
 frozenset({3}),
 frozenset({1, 3}),
 frozenset({1, 2, 3})}

Замечание:

Вы бы, наверно, хотели лучше всего получить красивый результат в виде

{set(), {1}, ..., {10}, {1, 2}, {1, 3}, ..., {1, 2, 3}, ..., {1, 2, 3, 4, 5, 6, 7, 8, 8, 10}}

Но это невозможно по определению.

В Питоне множество не может заключать в себе множества.
(Говоря о регулярных множествах, т.е. о типе set.)

Вы можете легко проверить, что это сделать нельзя:
Попробуйте в Питоне написать например {{1, 2}}, и вы получите ошибку

TypeError: unhashable type: 'set'

К счастию, в Питоне находится тоже тип frozenset («замёрзшее» множество).


Объяснение:

Сначала напомним, что решением было

from more_itertools import powerset                         # pip install more-itertools

set2_bool = {frozenset(tuple_) for tuple_ in powerset(set2)}

и теперь его объясним:

  1. Используем функцию powerset() из модуля more_itertools.

    Эта функция возвращает генератор, который генерирует все подмножества, но к сожалению не в виде множеств, а кортежей.

  2. Генератором множества

    {frozenset(tuple_) for tuple_ in powerset(set2)}
    

    выбираем постепенно каждую из этих кортежей (tuple_) и конвертируем ее в «замёрзшее» множество (frozenset), получая в итоге их множество.

→ Ссылка