輸入:樹結構是按照父/子帳戶的分層順序分隔出來的財務帳戶列表。任何給定的帳戶都可以有任意數量的父母/子女。在Python結構中,每個孩子都是一個列表,可以包含任意數量的詞典和/或文本值。字典代表指向額外帳戶的孩子,而文本值代表沒有其他後代的孩子。這裏是JSON(測試它,請把它轉換回在Python)格式的一些示例輸入:使用嵌套值搜索樹結構?
[
{
"Assets":[
{
"Bank":[
"Car",
"House"
]
},
{
"Savings":[
"Emergency",
{
"Goals":[
"Roof"
]
}
]
},
"Reserved"
]
}
]
在幕後有一個包含看起來像這樣的帳戶定義的輸入文件:
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"]
我怎麼會做出這種遞歸向下搜索到ň兒?
傳遞你的搜索字符串作爲列表或分裂「:」在函數內部。在函數內部,再次運行該函數,其餘搜索元素作爲參數。 – handle
這就是我要去的地方,但是我一直陷在如何知道我什麼時候處於搜索的「結尾」。換句話說,我如何知道我已經到達最終的孩子,我需要返回最終孩子的任何子女帳戶(以及如何在遞歸如此之後返回這些值)。 –
堅持下去,爲你嘗試一下... – handle