如何清除字典中的所有项- Python



我正在研究一个'书签'相关的应用程序。我有一个字典数据,包含所有的书签从浏览器。输入如下所示:

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。请记住,它可以有任意数量的嵌套文件夹。

您想要包含所有文件夹(包括子文件夹)名称的列表?如果是,方法是递归地遍历所有项,检查它们是否为文件夹,如果是,则将其名称附加到列表中。例如:

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))

您想要这样的东西。递归地查看书签——如果您正在处理一个文件夹,那么将其传递回相同的函数,并在执行过程中计算结果。假设在这个用例中,您不会遇到输入过大的问题。

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()))

删除文件夹'name'之外的所有数据。

注意事项:

  • 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": []},
]

如果您继续使用此列表进行处理(即,用字典列表而不是名称列表来描述文件夹),请小心,不要让这些额外的数据混淆您运行它的任何算法。

相关内容

  • 没有找到相关文章

最新更新