Non sono sicuro della terminologia matematica appropriata per il codice che sto tentando di scrivere. Mi piacerebbe generare combinazioni di numeri interi univoci, in cui "sottoinsiemi ordinati" di ciascuna combinazione vengono utilizzati per escludere alcune combinazioni successive.Enumerazione efficiente di sottoinsiemi ordinati in Python
Speriamo che un esempio renderà questo chiaro:
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
che i risultati di codice in uscita che contiene tutti i sottoinsiemi che voglio, ma anche alcuni tra quelli in più che non lo faccio. Ho inserito manualmente i commenti per indicare quali elementi non desidero.
(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
Così, l'uscita desiderata del mio generatore o iteratore sarebbe:
(0, 1, 2)
(0, 1, 3)
(0, 2, 3)
(1, 2, 3)
(0, 3)
(1, 3)
(2, 3)
(3,)
So che potrei fare una lista di tutti i (voluto e non voluto) combinazioni e poi filtrare quelli che non voglio, ma mi chiedevo se esistesse un modo più efficiente, generatore o iteratore.
È possibile inserire tutti i sottoinsiemi in un dizionario. Quindi se generate (0, 1, 2) scrivete un metodo per hash {(0,): True, (1,): True, (0, 1): True, (0, 2): True, (0, 1, 2): True} e così via. Quindi puoi cercare in questa tabella hash per vedere se vuoi il nuovo set. – Matt