python - 遍历嵌套 JSON 的迭代方式?
问题描述
假设我有以下员工 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
我想知道有没有更好的方法来迭代地做到这一点?
解决方案
您始终可以将递归函数转换为迭代函数。在这里,一种简单的技术是使用堆栈,当您发现团队成员时将其推入其中。如果您在途中找到该物品,请将其退回。如果堆栈是空的,你就完成了。
例如:
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
and False
。
推荐阅读
- ionic-framework - 自定义验证器反应形式离子
- python - PyQt5 QSqlDatabase:未加载 ubuntu 的 QMYSQL 驱动程序
- django - 在 Django 中获取 RelatedObjectDoesNotExist 错误,如果不存在则想创建新对象
- python - Scrapy Cloud 跳过循环
- colors - 根据列中的前一个单元格格式化列中的单元格 - Excel 2019
- youtube - Ghost cms youtube 视频嵌入大小
- vue.js - 使用 nuxt-link 时 IntersectionObserver 不起作用
- list - 在 Kotlin 中将字符串日期转换为时间戳
- javascript - Javascript getElementsByTagName 为某些标签返回空列表,并适用于其他一些标签
- javascript - 模块解析失败:号码无效