EDYCJA: Zobacz poniżej, aby uzyskać sugerowaną odpowiedź i jak to jeszcze nie jest w porządku.Znajdź wszystkie ścieżki w drzewie (zagnieżdżone dyktety) od góry do dołu.
Jest wiele podobnych pytań do tego na Stack Overflow, ale żaden dokładnie taki jak w Pythonie. Jestem początkującym programistą, więc proszę, idź łatwo.
Mam drzewo zagnieżdżonych słowników, tak:
[{'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}]}]}]}]
Chcę spłaszczyć wszystkie ścieżki od góry do dołu i skończyć z tym:
[[{'word': 'The'},
{'word': 'End'}],
[{'word': 'The'},
{'word': 'quick'},
{'word': 'brown'},
{'word': 'fox'}],
[{'word': 'The'},
{'word': 'best'},
{'word': 'of'},
{'word': 'times'}]]
Zrobiłem piękny mała funkcja rekursywna, która stworzyła oryginalną strukturę, ale trudno mi ją zneutralizować. To ile mam:
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
... który powraca w ten sposób:
[{'word': 'The'},
{'word': 'End'},
{'word': 'quick'},
{'word': 'brown'},
{'word': 'fox'},
{'word': 'best'},
{'word': 'of'},
{'word': 'times'}]
... co jest wyraźnie dość blisko, ale nie całkiem w porządku.
Wiem, że ta funkcja jest prawdopodobnie okropnie nie-Pythonic, ale uczę się programowania, więc nie próbuję nawet korzystać z ewentualnych funkcji językowych, które pozwoliłyby mi wymknąć się z tego, scratch (", powiedział, publikując na Q & Stronę w nadziei, że jej członkowie pomogą mu wymyślić trochę myśli).
A więc: co robię źle?
EDIT: Moshe poniżej poprawione kilka problemów:
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
Jest bliżej jeszcze, ale nie w porządku:
[{'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'}]]
TIL "Elide" to słowo. – AndyPerfect