Nel risolvere il codice dell'Advent of Code del 2015 (nella fattispecie, il puzzle del giorno 17), mi sono imbattuto nel problema di ottenere tutte le possibili combinazioni "distinte e non complete" di una lista.
Per "distinte e non complete" si intende tutte le possibili combinazioni (senza contare le permutazioni degli elementi e senza ripetizioni) degli elementi presenti nella lista, con un numero di elementi che va da 0 al numero totale degli elementi della lista.
In pratica, l'elenco finale va da una lista vuota alla lista con tutti gli elementi presenti.
Un paio di annotazioni:
- sono state sviluppate due funzioni, una che processa tutti gli "step" da 0 al numero di elementi presenti, e l'altra che effettua tutte le possibili combinazioni "distinte"
- la funzione che produce le combinazioni sfrutta la ricorsione
Questo è un codice funzionante per ottenere questo genere di combinazioni (senza l'utilizzo della libreria itertools):
inputList = ["a", "b", "c"]
def getAllCombinations(listToComb):
res = []
for i in range(0, len(listToComb) + 1):
res += getCombinations(listToComb, i)
return res
def getCombinations(listToComb, n):
if n == 0:
return [[]]
else:
res = []
for i in range(len(listToComb)):
for c in getCombinations(listToComb[i+1:], n - 1):
res.append([listToComb[i]] + c)
return res
print(getAllCombinations(inputList))Il codice sviluppato produce il seguente risultato:
[[], ['a'], ['b'], ['c'], ['a', 'b'], ['a', 'c'], ['b', 'c'], ['a', 'b', 'c']]
Nessun commento:
Posta un commento