J'ai été mis dans une position aujourd'hui où j'avais besoin d'énumérer toutes les combinaisons possibles de la liste déchiquetée. Par exemple, une approche naïve serait:Quelle serait une meilleure implémentation de toutes les combinaisons dans l'ordre lexicographique d'une liste déchiquetée?
for a in [1,2,3]:
for b in [4,5,6,7,8,9]:
for c in [1,2]:
yield (a,b,c)
Ceci est fonctionnel, mais pas générale en termes de nombre de listes qui peuvent être utilisées. Voici une approche plus générale:
from numpy import zeros, array, nonzero, max
make_subset = lambda x,y: [x[i][j] for i,j in enumerate(y)]
def combinations(items):
num_items = [len(i) - 1 for i in items]
state = zeros(len(items), dtype=int)
finished = array(num_items, dtype=int)
yield grab_items(items, state)
while True:
if state[-1] != num_items[-1]:
state[-1] += 1
yield make_subset(items, state)
else:
incrementable = nonzero(state != finished)[0]
if not len(incrementable):
raise StopIteration
rightmost = max(incrementable)
state[rightmost] += 1
state[rightmost+1:] = 0
yield make_subset(items, state)
Des recommandations sur une meilleure approche ou des raisons contre l'approche ci-dessus?
Cette question ressemble à ceci: http://stackoverflow.com/questions/215908/whats-a-good-non-rec ursive-algorithm-to-calculer-a-cartésien-produit – Brian