Как вывести булевы множества в 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}]
Применим функцию 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)}
и теперь его объясним:
Используем функцию
powerset()из модуляmore_itertools.Эта функция возвращает генератор, который генерирует все подмножества, но к сожалению не в виде множеств, а кортежей.
Генератором множества
{frozenset(tuple_) for tuple_ in powerset(set2)}выбираем постепенно каждую из этих кортежей (
tuple_) и конвертируем ее в «замёрзшее» множество (frozenset), получая в итоге их множество.