繁体   English   中英

如何在 python 中实现此递归?

[英]How can I implement this recursion in python?

假设我有一个这样的字典

dict1 = [{
           'Name': 'Team1',
           'id': '1',
           'Members': [
                      {
                          'type': 'user',
                          'id': '11'
                      },
                      {
                          'type': 'user',
                          'id': '12' 
                      }
                      ]
        },
        {
            'Name': 'Team2',
            'id': '2',
            'Members': [
                         {
                            'type': 'group'
                            'id': '1'
                         },
                         {
                          'type': 'user',
                          'id': '21' 
                      }
                       ]
        },
        {
            'Name': 'Team3',
            'id': '3',
            'Members': [
                         {
                            'type': 'group'
                            'id': '2'
                         }
                       ]
        }]

我想得到一个 output 可以用所有不同的用户替换所有组和嵌套组。 在这种情况下,output 应该如下所示:

dict2 = [{
           'Name': 'Team1',
           'id': '1',
           'Members': [
                      {
                          'type': 'user',
                          'id': '11'
                      },
                      {
                          'type': 'user',
                          'id': '12' 
                      }
                      ]
        },
        {
            'Name': 'Team2',
            'id': '2',
            'Members': [
                         {
                           'type': 'user',
                           'id': '11'
                         },
                         {
                          'type': 'user',
                          'id': '12' 
                         }
                         {
                          'type': 'user',
                          'id': '21' 
                         }
                       ]
        },
        {
            'Name': 'Team3',
            'id': '3',
            'Members': [
                         {
                           'type': 'user',
                           'id: '11'
                         },
                         {
                          'type': 'user',
                          'id': '12' 
                         }
                         {
                          'type': 'user',
                          'id': '21' 
                         }
                       ]
        }]

现在让我们假设我有一个大型数据集来执行这些操作。 (大约 20k 个单独的组)

编写此代码的最佳方法是什么? 我正在尝试递归,但我不确定如何以这种方式搜索字典和列表,以免最终使用太多 memory

我认为你不需要递归。 循环就够了。

我认为您可以简单地评估每个Members ,如果是group类型,则获取user ,并使它们独一无二。 然后,您可以简单地将Members的值替换为distinct_users

您可能有一本用于以下组的字典:

group_dict = { 
    '1': [
        {'type': 'user', 'id': '11'},
        {'type': 'user', 'id': '12'}
    ],  
    '2': [
        {'type': 'user', 'id': '11'},
        {'type': 'user', 'id': '12'},
        {'type': 'user', 'id': '21'}
    ],
    '3': [
        {'type': 'group', 'id': '1'},
        {'type': 'group', 'id': '2'},
        {'type': 'group', 'id': '3'}  # recursive
    ]
    ...   
}

你可以试试:

def users_in_group(group_id):
    users = []
    groups_to_fetch = []
    for user_or_group in group_dict[group_id]:
        if user_or_group['type'] == 'group':
            groups_to_fetch.append(user_or_group)
        else:  # 'user' type
            users.append(user_or_group)
    
    groups_fetched = set()  # not to loop forever
    while groups_to_fetch:
        group = groups_to_fetch.pop()
        if group['id'] not in groups_fetched:
            groups_fetched.add(group['id'])
            for user_or_group in group_dict[group['id']]:
                if user_or_group['type'] == 'group' and user_or_group['id'] not in groups_fetched:
                    groups_to_fetch.append(user_or_group)
                else:  # 'user' type
                    users.append(user_or_group)

    return users


def distinct_users_in(members):
    distinct_users = []

    def add(user):
        if user['id'] not in user_id_set:
            distinct_users.append(user)
        user_id_set.add(user['id'])

    user_id_set = set()
    for member in members:
        if member['type'] == 'group':
            for user in users_in_group(member['id']):
                add(user)
        else:  # 'user'
            user = member
            add(user)

    return distinct_users


dict2 = dict1  # or `copy.deepcopy`
for element in dict2:
    element['Members'] = distinct_users_in(element['Members'])

每个Members由相应的 function 返回的distinct_users重新分配。 function 获取Members并从每个member类型中获取用户。 如果是user类型,则member本身就是用户。 虽然(获取的)用户被附加到distinct_user ,但您可以使用他们的id来获得唯一性。

当您获取users_in_group时,您可以使用两个列表; groups_to_fetchgroups_fetched 前者是一个堆栈,用于递归地获取组中的所有组。 后者不是再次获取已经获取的组。 或者,它可能永远循环。

最后,如果您的数据已经在 memory 中,则此方法可能不会耗尽 memory 并起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM