Это называется a power set (в вашем случае пустой комплект исключается).
Чтобы создать комплект питания, начните с набора с пустым набором в нем; затем для каждого элемента на входе установлен расширить возможности установки со всеми его подмножеств накопленных до сих пор с текущим элементом включен (в Python):
def powerset(lst):
S = [[]]
for item in lst:
S += [subset + [item] for subset in S]
return S
Пример:
print(powerset([1, 2, 3]))
# -> [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
К избегать одновременного создания всех подмножеств, может быть использовано рекурсивное определение:
- источник питания пустого Набор представляет собой набор с пустым множеством в нем
- власти набор из набора с
n
элементами содержат все подмножества из власти установить набор с n - 1
элементами плюс все эти подмножества с n
-й вошедшими.
def ipowerset(lst):
if not lst: # empty list
yield []
else:
item, *rest = lst
for subset in ipowerset(rest):
yield subset
yield [item] + subset
Пример:
print(list(ipowerset([1, 2, 3])))
# -> [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
Еще один способ создания набора мощности заключается в создании r
-длина подпоследовательности (комбинация) для всех r
от нуля до размера входного набора (itertools
recipe):)
from itertools import chain, combinations
def powerset_comb(iterable):
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
Пример:
print(list(powerset_comb([1, 2, 3])))
# -> [(), (1,), (2,), (3,), (1,2), (1,3), (2,3), (1,2,3)]
Смотрите также what's a good way to combinate through a set?.
Это домашнее задание? – NPE
С 100 цифрами существует 5050 подпоследовательностей. Вы действительно хотите всех? –
Итак, теперь вложенные петли для последовательности печати имеют фантастический алгоритм ** **. – phoeagon