入力:ツリー構造は、親/子アカウントの階層順に分離された金融口座のリストです。任意のアカウントは、任意の数の親子を持つことができます。 Python構造体では、各子は任意の数の辞書および/またはテキスト値を含むことができるリストです。辞書は追加のアカウントを指す子を表しますが、テキストの値はそれ以上の子孫を持たない子を表します。舞台裏ネストされた値でツリー構造を検索していますか?
[
{
"Assets":[
{
"Bank":[
"Car",
"House"
]
},
{
"Savings":[
"Emergency",
{
"Goals":[
"Roof"
]
}
]
},
"Reserved"
]
}
]
次のようになり、アカウントの定義が含まれている入力ファイルが存在している:ここではJSON(バックPythonでそれを変換してください、それをテストするため)でフォーマットされたいくつかの例の入力がある
Assets:Bank:House
Assets:Savings:Emergency
Assets:Savigs:Goals:Roof
上記のツリー構造を解析して作成する既存のコードがあります。
ゴール:最後の目標は、ツリーを検索して入力した文字列を利用して自動補完を行うことです。上記のサンプル入力を使用して、次の入力がそれぞれの出力を生成します:
"Assets" => ["Bank, "Savings", "Reserved"]
"Assets:Bank" => ["Car", "House"]
"Assets:Savings:Goals" => ["Roof"]
部分的な解決:私はつまずい取得していますどこ再帰があります。私は "ルート"アカウントの結果を与えることができるコードを作成することができましたが、子アカウントの結果を再帰的に返す方法はわかりません。
def search_tree(account, tree):
# Check to see if we're looking for a root level account
if isinstance(account, str) and ":" not in account:
# Collect all keys in the child dictionaries
keys = {}
for item in tree:
if isinstance(item, dict):
keys[item.keys()[0]] = item
# Check to see if the input matches any children
if account in keys:
# Collect all children of this account
children = []
for child in keys[account][account]:
if isinstance(child, str):
children.append(child)
else:
children.append(child.keys()[0])
return children
# tree = .....
account = "Assets"
print search_tree(account, tree) # Would produce ["Bank", "Savings", "Reserved"]
# In the future I would provide "Assets:Bank" as the account string and get back the following: ["Car", "House"]
がどのようになるだろうN子供まで検索するには、この再帰:ここでは、コードですか?
を、あなたはほぼ確実にこの時に向上させることができますが、これは素晴らしい出発点を与える上のリストまたは分割として、検索文字列を渡します「:」関数の中で。関数の中で、残りの検索要素をパラメータとして関数を再度実行します。 – handle
それは私が行っていたところですが、私が検索の「終わり」にいる時を知る方法についていました。言い換えれば、私は最終的な子供に達したことをどのように知っているでしょうか、そして最終的な子供の子供の説明を返す必要があります。 –
あなたのために何かを試してみてください... – handle