假设我有以下员工 JSON 文件:
{
"id": 1,
"name": "John",
"team": [
{
"id": 22,
"name": "Jes",
"team": []
},
{
"id": 24,
"name": "Jek",
"team": [
{
"id": 32,
"name": "jane",
"team": []
},
{
"id": 6,
"name": "Ron",
"team": {}
}
]
}
]
}
我想检查 id1 在他的团队中是否有 id 2,问题是我不知道“部门”,因为每个员工都可以有自己的“团队”列表。
我能想到的唯一解决方案是递归搜索 JSON,如下所示:
def find_id(id, data):
if data['id'] == id:
return data
else:
for emp in data['team']:
if find_id(id, emp):
return emp
return None
def is_bos(id1, id2, data):
data = find_id(id1, data)
if data:
two_found = find_id(id2, data)
if two_found:
return True
return False
return False
例如以下内容:
is_bos(1, 24, data) # should return true
is_bos(1, 32, data) # should return true
is_bos(32, 6, data) # should return false
is_bos(22, 24, data) # should return false
我想知道有没有更好的方法可以迭代地做到这一点?
答案 0 :(得分:1)
您始终可以将递归函数转换为迭代函数。在这里,一种简单的技术是使用一个堆栈,您可以在发现团队成员时将其推送到该堆栈上。如果您在途中找到了该物品,请将其归还。如果堆栈为空,您就完成了。
例如:
def find(d, target_id):
stack = d['team'][:]
while stack:
item = stack.pop()
if item['id'] == target_id:
return item
stack.extend(item['team'])
return -1
find(d, 32)
# {'id': 32, 'name': 'jane', 'team': []}
find(d, 100)
-1
这实质上创建了对树的深度优先搜索。当然,如果您只想要一个布尔值,请返回它而不是最后的 item
和 False
。