[英]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_fetch
和groups_fetched
。 前者是一个堆栈,用于递归地获取组中的所有组。 后者不是再次获取已经获取的组。 或者,它可能永远循环。
最后,如果您的数据已经在 memory 中,则此方法可能不会耗尽 memory 并起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.