我有一个看起来像这样的实例:
{
"_id": "cgx",
"capacity": 1000000000,
"chunks": [
{
"prs": [
{
"segs": [
{
"node_id": "server-0",
}
]
}
]
},
{
"prs": [
{
"segs": [
{
"node_id": "server-2",
}
]
},
{
"segs": [
{
"node_id": "server-3",
}
]
}
]
}
],
"health": "healthy",
"status": "ok"
}
块数组中的每个“块”都是一个Chunk实例,prs数组中的每个'pr'都是一个Pr实例,segs数组中的每个'seg'都是一个Seg实例
我想遍历实例并从所有实例中累积一组'node_id'值。我是通过以下方式完成的:
def setDistinctElements(self, result):
elements = []
for chunk in getattr(result, 'chunks'):
for pr in getattr(chunk, 'prs'):
for seg in getattr(pRaid, 'segs'):
elements.append(getattr(seg, 'node_id'))
有没有更有效的方法来做它而不是循环3次?每个这样的实例都可以嵌入很多“块”,“prs”和“segs”实例。
我无法运行你的代码所以做了类似的代码。并且运行得更快我将json转换为字符串并弄乱它以获得我需要的东西。而它几乎快了x2倍1
lst = []
for row in a.replace('[','').replace(' ','').replace('{','').replace('\n','').replace(']','').replace('}','').replace('"','').sp
lit(','):
if "node_id" in row:
lst.append(row.split(':')[-1])
您可以使用带有生成器的递归来遍历任何深度的结构:
data = {'_id': 'cgx', 'capacity': 1000000000, 'chunks': [{'prs': [{'segs': [{'node_id': 'server-0'}]}]}, {'prs': [{'segs': [{'node_id': 'server-2'}]}, {'segs': [{'node_id': 'server-3'}]}]}], 'health': 'healthy', 'status': 'ok'}
def get_nodes(d):
for a, b in d.items():
if a == 'node_id':
yield b
elif isinstance(b, dict):
yield from get_nodes(b)
elif isinstance(b, list):
for c in b:
yield from get_nodes(c)
print(list(get_nodes(data)))
输出:
['server-0', 'server-2', 'server-3']