我正在開發一個與“書簽”相關的應用程式。我有一個字典資料,其中包含瀏覽器中的所有書簽。輸入如下所示:
data = {
"bookmarks_tab": {
'children': [
# This parent folder contains multiple nested folders, eg:
{
'name': 'nested folder 1',
'type': 'folder',
'children': [
# Now this nested folder can have multiple nested folders!
{
'name': 'nested subfolder',
'type': 'folder',
'children': [
# So on and on
]
}
]
}
],
'type': 'folder',
'name': 'bookmarks_tab'
}
}
我應該采取什么方法來找出輸入有多少個檔案夾(包括嵌套的子檔案夾),包括它的name
. 請記住,它實際上可以有任意數量的嵌套檔案夾。
uj5u.com熱心網友回復:
您想要包括子檔案夾在內的所有檔案夾的名稱串列?如果是這樣,解決方法是遞回遍歷所有專案,檢查它們是否是檔案夾,如果是,將它們的名稱附加到串列中。例如:
def find_folders(parent: list) -> list:
# List of names of all folders found
folders = []
for folder in parent:
if folder['type'] == 'folder':
folders.append(folder.get('name'))
folders.extend(find_folders(folder.get('children', [])))
return folders
folders = find_folders(data['bookmarks_tab']['children'])
# Names of all folders
print(folders)
# Number of folders
print(len(folders))
uj5u.com熱心網友回復:
你想要這樣的東西。遞回查看書簽 - 如果您正在處理一個檔案夾,則將其傳遞回相同的函式,并在執行程序中計算結果。大概在這個用例中,您不會遇到輸入太大的問題。
def process_bookmarks(bookmarks: dict) -> list:
if bookmarks.get("type") == "folder":
return 1 sum(process_bookmarks(child) for child in bookmarks.get("children", []))
else:
return 0
如果你想要一個所有“檔案夾”專案的串列,你可以做類似的事情:
def process_bookmarks(bookmarks: dict) -> list:
folders = []
children = bookmarks.pop("children", [])
if bookmarks.get("type") == "folder":
for child in children:
folders.extend(process_bookmarks(child)
folders.append(bookmarks) # Note 'children' key has been removed!
return folders
這不會回傳任何子書簽 - 僅回傳檔案夾。else
盡管將子句附加到輸出串列中,但添加子句很容易。
如果您只對回傳檔案夾的一個元素感興趣,則可以采用以下兩種方法之一。上面的輸出中的任何一個:
names = [b.get("name") for b in process_bookmarks(bookmarks)]
它重新處理回傳的檔案夾的整個串列,或者:
def process_bookmarks(bookmarks: dict) -> List[str]:
folders = []
children = bookmarks.pop("children", [])
if bookmarks.get("type") == "folder":
for child in children:
folders.extend(process_bookmarks(child)
folders.append(bookmarks.get("name"))
return folders
result = process_bookmarks(data.get("bookmarks_tab", dict()))
這會洗掉檔案夾“名稱”之外的所有資料。
一些重要的注意事項:
- Python 有一個最大的遞回深度。如果您的書簽嵌套超過此深度,則此方法不起作用。
extend()
將原始串列和擴展串列復制到新串列中。這意味著如果您從長度為 10 的串列開始并將其擴展 1,則需要 11 次操作。同樣,如果您從長度為 10 的串列開始并將其擴展 10,則需要 20 次操作。如果您有一個包含三個嵌套檔案夾的結構,它將1 (1 1) (1 2) = 6
執行操作。對于這個應用程式,這可能無關緊要 - 但如果您正在處理巨大的結果,它可能會。- 如果您只是回傳字典,請注意您的字典仍將包含原始資料。因此,如果我有三個嵌套檔案夾,并且我向下遞回一層并在結果中回傳該字典附加到向下兩層的字典串列中,則總資料是三個字典的價值。我提到這不是為了性能,而是因為輸出看起來像這樣:
dx = [
{"a": [{"b": ["c": []]]},
{"b": ["c": []]]},
{"c": []},
]
不是這個:
dx = [{"a": []},
{"b": []},
{"c": []},
]
如果您繼續使用此串列進行處理(即描述檔案夾的字典串列而不是名稱串列),請注意這些額外資料不會混淆您正在運行的任何演算法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/495561.html
上一篇:使用遞回從嵌套字典中獲取值