Nie jestem pewien odpowiedniej terminologii matematycznej dla kodu, który próbuję napisać. Chciałbym generować kombinacje unikalnych liczb całkowitych, gdzie "uporządkowane podzbiory" każdej kombinacji są używane do wykluczenia pewnych późniejszych kombinacji.Efektywne wyliczanie uporządkowanych podzbiorów w Pythonie
Mam nadzieję przykładem będzie to jasne:
from itertools import chain, combinations
mylist = range(4)
max_depth = 3
rev = chain.from_iterable(combinations(mylist, i) for i in xrange(max_depth, 0, -1))
for el in list(rev):
print el
, że wyniki kodu na wyjściu, który zawiera wszystkie podzbiory chcę, ale także jakieś dodatkowe te, które nie. Ręcznie wstawiłem komentarze, aby wskazać, których elementów nie chcę.
(0, 1, 2)
(0, 1, 3)
(0, 2, 3)
(1, 2, 3)
(0, 1) # Exclude: (0, 1, _) occurs as part of (0, 1, 2) above
(0, 2) # Exclude: (0, 2, _) occurs above
(0, 3) # Keep
(1, 2) # Exclude: (1, 2, _) occurs above
(1, 3) # Keep: (_, 1, 3) occurs above, but (1, 3, _) does not
(2, 3) # Keep
(0,) # Exclude: (0, _, _) occurs above
(1,) # Exclude: (1, _, _) occurs above
(2,) # Exclude: (2, _) occurs above
(3,) # Keep
Zatem pożądane wyjście mojego generatora lub iterator byłoby:
(0, 1, 2)
(0, 1, 3)
(0, 2, 3)
(1, 2, 3)
(0, 3)
(1, 3)
(2, 3)
(3,)
Wiem, że mógłbym zrobić listę wszystkich (chciane i niechciane) kombinacji, a następnie odfiltrować te, których nie chcę, ale zastanawiałem się, czy istnieje bardziej wydajny, oparty na generatorze lub iteratorze sposób.
Możesz mieszać wszystkie podzestawy w słowniku. Więc jeśli generujesz (0, 1, 2) napisz metodę na hash {(0,): True, (1,): True, (0, 1): True, (0, 2): True, (0, 1, 2): True} i tak dalej. Następnie możesz sprawdzić w tej tabeli mieszania, czy chcesz nowy zestaw. – Matt