我試圖遍歷這種樹,想法是獲得所有“標題”。注意這個結構會變大,這意味著未來每個標題都可以得到更多的子類別。任何的想法?
我正在嘗試這樣做:
def continue_searching(item):
for i in len(item):
if categories[i]["subcategories"]:
continue_searching(i["subcategories"])
print(i["subcategories"])
def give_titles(categories):
for i in len(categories):
if categories[i]["subcategories"]:
continue_searching(i["subcategories"])
print(i['title'])
categories = [
{
"title": "Food",
"subcategories": [
{"title": "Bread"},
{
"title": "Meat",
"subcategories": [
{"title": "Pork",
"subcategories": [
{"title": "White Pork"},
{"title": "Red Pork"}
]
},
{"title": "Beef"},
],
},
{"title": "Cheese"},
],
},
{"title": "Drinks"},
]
give_titles(categories)
預期輸出:
Food
-Bread
-Meat
--Pork
---White Pork
---Red Pork
--Beef
-Cheese
Drinks
請注意,我沒有使用遞回,因為我不清楚何時停止呼叫并且我不想使呼叫堆疊飽和。
uj5u.com熱心網友回復:
定義這個函式:
def write_titles(cats, depth=0):
for c in cats:
print('-'*depth, c['title'])
write_titles(c.get('subcategories', []), depth 1)
然后使用write_titles(categories).
uj5u.com熱心網友回復:
像這樣遍歷和列印資料結構通常是在您嘗試時使用遞回完成的。
對于您的代碼,我們希望在資料結構的每個進一步嵌套上重復呼叫一個函式。
示例代碼:
def print_titles(categories, depth=0):
for category in categories:
print('-' * depth, category['title'])
if 'subcategories' in category:
print_titles(category['subcategories'], depth 1)
由于您已經更改了問題并希望使用無遞回解決方案,因此最好的方法可能是使用如下迭代器:
def print_titles(categories):
stack = [iter(categories)]
while stack:
iterator = stack.pop()
for item in iterator:
print("-" * len(stack), item['title'])
if 'subcategories' in item:
stack.append(iterator)
stack.append(iter(item['subcategories']))
break
uj5u.com熱心網友回復:
你可以使用遞回編程
def get_all_titles(data, output=[]):
if isinstance(data, dict):
output.append(data.get("title"))
data = data.get("subcategories", [])
if isinstance(data, list):
for item in data:
get_all_titles(item)
return output
輸出
print(get_all_titles(categories))
['Food', 'Bread', 'Meat', 'Pork', 'White Pork', 'Red Pork', 'Beef', 'Cheese', 'Drinks']
uj5u.com熱心網友回復:
您定義的結構本質上是一個單獨樹的串列。
我只是迭代了串列中的每個“樹”,并對樹進行了預序遍歷。
categories = [
{
"title": "Food",
"subcategories": [
{"title": "Bread"},
{
"title": "Meat",
"subcategories": [
{"title": "Pork",
"subcategories": [
{"title": "White Pork"},
{"title": "Red Pork"}
]
},
{"title": "Beef"},
],
},
{"title": "Cheese"},
],
},
{"title": "Drinks"},
]
# What's really defined here is like a list of trees
def preorder(root, depth):
print("-" * depth root["title"])
if "subcategories" in root:
for child in root["subcategories"]:
preorder(child, depth 1)
def printCategories(categories):
for tree in categories:
preorder(tree, 0)
printCategories(categories)
這輸出:
Food
-Bread
-Meat
--Pork
---White Pork
---Red Pork
--Beef
-Cheese
Drinks
既然你也提到,你不希望使用遞回,只是用自己的堆疊如圖所示進行遍歷這里。
uj5u.com熱心網友回復:
def all_titles(data, output=[]):
if x(data, dict):
output.append(data.get("title"))
data = data.get("subcategories", [])
if x(data, list):
for y in data:
all_titles(item)
return
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/392899.html
下一篇:函式如何區分指標和字串?
