giovedì 9 gennaio 2025

PYTHON - Funzione per calcolare le combinazioni "distinte e non complete" di una lista

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