提问人:ivan.grishin 提问时间:9/7/2023 最后编辑:ivan.grishin 更新时间:9/7/2023 访问量:49
获取 Wrike 项目结构作为嵌套字典
Get Wrike project structure as nested dictionary
问:
我想将字典作为键的层次结构,其中键是 Wrike 项目中的文件夹或任务。 我有一个函数 get_folder(idx),它接受一个文件夹 id 并返回一个带有键 id、childIds、title 的字典。当前标题将作为根键添加到字典层次结构中。 然后循环访问 childIds 并获取下一个字典,其标题必须是根字典的子字典。 如果该字典有 childIds,则重复迭代。 我在正确编写递归函数时遇到了问题。
具有混合文件夹/项目/任务结构的 Wrike 项目:
**MAIN_FOLDER**
--*PRJ01*
--*PRJ02*
--*PRJ03*
----PRJ03_SUBFOLDER01
----PRJ03_SUBFOLDER02
我想把这个结构作为嵌套字典。
我目前的代码:
import requests
import json
token = ""
startpoint = 'https://www.wrike.com/api/v4'
root_id = ''
def make_request(endpoint):
headers = {'Authorization': f'Bearer {token}'}
url = f"{startpoint}/{endpoint}"
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.json()
def get_folder(idx):
data = make_request(f"folders/{idx}")['data'][0]
filtered_dict = {
'title': data['title'],
'id': data['id'],
'childIds': data['childIds']
}
return filtered_dict
def traverse(folder_id):
hierarchy = {}
folder_data = get_folder(folder_id)
folder_title = folder_data['title']
folder_id = folder_data['id']
folder_childIds = folder_data['childIds']
if folder_title not in hierarchy:
hierarchy[folder_title] = {}
if folder_childIds != []:
for folder_childId in folder_childIds:
child_data = get_folder(folder_childId)
child_title = child_data['title']
child_id = child_data['id']
child_childIds = child_data['childIds']
hierarchy[folder_title][child_title] = hierarchy.get(child_title, {})
traverse(child_id)
return hierarchy
hierarchy = traverse(root_id)
print(hierarchy)
结果:{'MAIN_FOLDER': {'PRJ01': {}, 'PRJ02': {}}}
答:
0赞
Barmar
9/7/2023
#1
您无需在 中添加 2 个字典级别。每次遍历只会向嵌套字典添加 1 个级别。你得到重复的键,因为你在调用方(当它是 )和被叫方(当它是 )中分配键时。traverse()
child_title
folder_title
进行递归调用时,将结果分配给该子标题的 dictionary 元素。
def traverse(folder_id):
hierarchy = {}
folder_data = get_folder(folder_id)
folder_childIds = folder_data['childIds']
for folder_childId in folder_childIds:
child_data = get_folder(folder_childId)
child_title = child_data['title']
child_id = child_data['id']
hierarchy[child_title] = traverse(child_id)
return hierarchy
没有必要 .如果列表为空,则循环不会执行任何操作。if folder_childIds != []:
评论
0赞
ivan.grishin
9/7/2023
感谢Barmar的解决方案和提示,他们帮助了我很多。递归函数对我来说是一个挑战。还有很多工作要做。
下一个:如何更新嵌套字典中的键
评论
hierarchy[folder_title][child_title] = traverse(child_id)
hierarchy
hierarchy[child_title] =
child_id
child_name