Ho un dizionario di liste:Creare una gerarchia da un dizionario di liste
a = {
'a': [1, 2, 3],
'b': [1, 2, 4],
'c': [1, 2],
'd': [1, 2, 3, 4, 5],
'e': [3],
'f': [3, 7],
'g': [3, 3],
'h': [3, 3, 3, 3, 3],
'i': [3, 3, 3, 3, 4],
}
E vorrei creare la struttura gerarchica da questo dizionario che sarà raggruppare gli elementi in modo simile (esatta struttura non ha importanza , così come il rapporto tra gli elementi è conservato):
/\
/ \
e c
/\ /\
f g a b
/\ |
h i d
la gerarchia va come segue: array g
è un prefisso di matrice h
e i
e quindi è il loro antenato. Ma e
è un prefisso di g
, quindi e
è un antenato di g
.
Ecco la mia idea di come ottenere questo risultato.
- Ordina il dizionario in base al numero di elementi nella lista, che sono stato in grado di raggiungere con
s = sorted(a.items(), key=lambda e: len(e[1]))
. Questo mi darà la seguente struttura:
.
('e', [3])
('c', [1, 2])
('g', [3, 3])
('f', [3, 7])
('a', [1, 2, 3])
('b', [1, 2, 4])
('d', [1, 2, 3, 4, 5])
('h', [3, 3, 3, 3, 3])
In questo momento mi può trovare progenitori scorrendo elementi e controllando se un elemento è un prefisso di altri elementi. A partire dal primo.
e
è un prefisso dig
,f
eh
. Ec
è un prefisso dia
,b
,d
. Quindi questi due elementi sono i genitori.Al momento capisco che devo ricorrere alla ricorsione per entrare in ciascun genitore e per eseguire la stessa operazione, ma non sono riuscito a trovare una soluzione giusta.
Così fa qualcuno sa come affrontare questo problema. O sto complicando troppo le cose e c'è un modo più semplice per raggiungere la soluzione.
P.S. questo non è un compito a casa o una domanda di intervista (potrebbe anche esserlo). Questa è solo la mia astrazione da un problema che sto cercando di risolvere.
io non vedo proprio il motivo per cui bisogno di ricorsione (pensavo di essere sicuro che potesse essere usato in qualche modo). Per farlo in n^2, per ogni elemento, controlla tutti gli altri elementi per vedere se sono figli. Dopo di che si dovrebbe essere fatto ... – Hammer
anche non si ha realmente bisogno di controllare tutti gli altri elementi, solo quelle dopo che nel vostro elenco ordinato (per lunghezza) – Hammer
Per me, suona come siete alla ricerca di un trie (aka albero prefisso). [Vedi trie su wikipedia] (http://en.m.wikipedia.org/wiki/Trie) –