MODIFICA: Vedi sotto per una risposta suggerita e come non è ancora abbastanza giusto.Trova tutti i percorsi attraverso un albero (detti nidificati) dall'alto verso il basso
Ci sono molte domande simili a questo su Stack Overflow, ma nessuno esattamente come in Python. Sono un novizio della programmazione, quindi per favore andate piano.
ho un albero di dizionari nidificate, in questo modo:
[{'word': 'The',
'next': [{'word': 'End',
'next': None},
{'word': 'quick',
'next': [{'word': 'brown',
'next': [{'word': 'fox',
'next': None}]}]},
{'word': 'best',
'next': [{'word': 'of',
'next': [{'word': 'times',
'next': None}]}]}]}]
voglio appiattire tutti i percorsi da cima a fondo e finire con questo:
[[{'word': 'The'},
{'word': 'End'}],
[{'word': 'The'},
{'word': 'quick'},
{'word': 'brown'},
{'word': 'fox'}],
[{'word': 'The'},
{'word': 'best'},
{'word': 'of'},
{'word': 'times'}]]
ho fatto una bella una piccola funzione ricorsiva che ha creato la struttura originale in primo luogo, ma ho difficoltà a non ricrearla. Questo è quanto ho ottenuto:
def flatten_combinations(result_tree, current_combo = None, all_combos = None):
if current_combo is None:
current_combo = []
if all_combos is None:
all_combos = []
if result_tree is None:
all_combos.append(current_combo)
return
for word in result_tree:
current_combo.append({'word': word['word']})
flatten_combinations(word['next'], current_combo, all_combos)
return current_combo
... che restituisce questo:
[{'word': 'The'},
{'word': 'End'},
{'word': 'quick'},
{'word': 'brown'},
{'word': 'fox'},
{'word': 'best'},
{'word': 'of'},
{'word': 'times'}]
... che è chiaramente un po 'stretta, ma non del tutto giusto.
So che questa funzione è probabilmente orribilmente non-Pythonic, ma mi sto insegnando a programmare, quindi non sto nemmeno cercando di sfruttare le funzionalità del linguaggio possibilmente esistenti che mi consentiranno di eludere il pensiero attraverso questa roba da scratch (", ha detto, postando a un Q & un sito nella speranza che i suoi membri lo aiutassero a elidere un po 'di pensiero).
Quindi: cosa sto sbagliando?
EDIT: Moshe sotto corretto un paio di problemi:
def flatten_combinations(result_tree, current_combo = None, all_combos = None):
if current_combo is None:
current_combo = []
if all_combos is None:
all_combos = []
if result_tree is None:
all_combos.append(current_combo)
return
for word in result_tree:
current_combo = current_combo[:]
current_combo.append({'word': word['word']})
flatten_combinations(word['next'], current_combo, all_combos)
return all_combos
Questo è più vicino ancora, ma non del tutto a destra:
[{'word': 'The'},
{'word': 'End'}],
[{'word': 'The'},
{'word': 'End'},
{'word': 'quick'},
{'word': 'brown'},
{'word': 'fox'}],
[{'word': 'The'},
{'word': 'End'},
{'word': 'quick'},
{'word': 'best'},
{'word': 'of'},
{'word': 'times'}]]
FINO "Elide" è una parola. – AndyPerfect