有没有一种有效的方法来累积Python中嵌套实例的值?

问题描述 投票:0回答:2

我有一个看起来像这样的实例:

{
    "_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”实例。

python python-2.7 instance
2个回答
1
投票

我无法运行你的代码所以做了类似的代码。并且运行得更快我将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])

0
投票

您可以使用带有生成器的递归来遍历任何深度的结构:

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']
© www.soinside.com 2019 - 2024. All rights reserved.