获取 Wrike 项目结构作为嵌套字典

Get Wrike project structure as nested dictionary

提问人:ivan.grishin 提问时间:9/7/2023 最后编辑:ivan.grishin 更新时间:9/7/2023 访问量:49

问:

我想将字典作为键的层次结构,其中键是 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': {}}}

Python 字典 递归 嵌套

评论

0赞 Barmar 9/7/2023
您需要将递归调用的结果分配给某个地方,例如字典元素。
0赞 Barmar 9/7/2023
大概是这样的hierarchy[folder_title][child_title] = traverse(child_id)
0赞 ivan.grishin 9/7/2023
感谢您的评论。我现在遇到了重复的密钥错误。{ “TEST_FOLDER”: { “PRJ01”: { “PRJ01”: {}}, “PRJ02”: { “PRJ02”: {}}, “PRJ03”: { “PRJ03”: {“PRJ03_SUBFOLDER01”: {“PRJ03_SUBFOLDER01”: {}}, “PRJ03_SUBFOLDER02”: {“PRJ03_SUBFOLDER02”: {}}}}}}
0赞 Barmar 9/7/2023
您不应该将文件夹标题放入 中,因为它位于父字典中。所以你只想hierarchyhierarchy[child_title] =
0赞 Barmar 9/7/2023
你能说明期望的结果应该是什么吗?您在顶部显示的结构与 和 有什么关系?child_idchild_name

答:

0赞 Barmar 9/7/2023 #1

您无需在 中添加 2 个字典级别。每次遍历只会向嵌套字典添加 1 个级别。你得到重复的键,因为你在调用方(当它是 )和被叫方(当它是 )中分配键时。traverse()child_titlefolder_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的解决方案和提示,他们帮助了我很多。递归函数对我来说是一个挑战。还有很多工作要做。