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

时间:2019-04-24 10:51:40

标签: python python-2.7 instance

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

url('./assets/images/home-background.png')

chunks数组中的每个“ chunk”都是Chunk实例,prs数组中的每个“ pr”都是Pr实例,segs数组中的每个“ seg”都是Seg实例

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

url('../images/home-background.png')

是否有更有效的方法来执行此操作而不是循环3次?每个这样的实例可以嵌套很多“块”,“ prs”和“ segs”实例。

2 个答案:

答案 0 :(得分: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])

答案 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']