首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中,有没有从嵌套实例中累加值的有效方法?

在Python中,有没有从嵌套实例中累加值的有效方法?
EN

Stack Overflow用户
提问于 2019-04-24 18:51:40
回答 2查看 91关注 0票数 0

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

代码语言:javascript
复制
{
    "_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"
}

chunks数组中的每个“Chunk”是一个Chunk实例,prs数组中的每个“Pr”是一个Pr实例,segs数组中的每个“Seg”是一个Seg实例

我想要遍历实例,并从所有实例中累积一组“node_id”值。我是通过以下方式完成的:

代码语言:javascript
复制
 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次更有效的方法呢?每个这样的实例都可以有很多'chunks','prs‘和'segs’实例嵌套在其中。

EN

回答 2

Stack Overflow用户

发布于 2019-04-24 19:40:42

我不能运行你的代码,所以写了一个类似的代码。为了更快地运行它,我将json转换为字符串,并对其进行处理以获得所需的内容。这几乎是X2更快的1

代码语言:javascript
复制
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])
票数 1
EN

Stack Overflow用户

发布于 2019-04-24 23:26:32

您可以通过生成器使用递归来遍历任意深度的结构:

代码语言:javascript
复制
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)))

输出:

代码语言:javascript
复制
['server-0', 'server-2', 'server-3']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55828355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档