如何使用Python在深度嵌套的结构中收集特定值

2024-05-15 23:48:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试获取实例id的列表,这些id是在python脚本中使用boto3api从describe_instances调用获得的。对于那些不了解aws的人,如果需要的话,我可以在删除细节之后发布一个详细的代码。我正试图从这样的结构中访问一个项目

   u'Reservations':[  
      {  
         u'Instances':[  
            {
              u'InstanceId':'i-0000ffffdd'
            },
            {  },   ### each of these dict contain a id like above
            {  },
            {  },
            {  }
         ]
      },
      {  
         u'Instances':[  
            {  },
            {  },
            {  },
            {  },
            {  }
         ]
      },
      {  
         u'Instances':[  
            {  }
         ]         
      }
]

我现在访问它就像

instanceLdict = []
instanceList = []
instances = []
for r in reservations:
  instanceList.append(r['Instances'])
for ilist in instanceList:
   for i in ilist:
       instanceLdict.append(i)
for i in instanceLdict:
    instances.append(i['InstanceId']) ####i need them in a list
print instances

仅供参考:我的reservations变量包含u'Reservations':的整个列表

我觉得这是低效的,因为我是一个python新手,我真的认为一定有更好的方法来做这件事,而不是多个forif。有没有更好的办法?请指出在我的场景中可能有用的结构/方法等


Tags: instances方法inid列表for结构reservations
1条回答
网友
1楼 · 发布于 2024-05-15 23:48:08

实际上,您的解决方案并没有那么低效,只是您实际上不必创建所有顶级列表来最终保存实例id。您可以做的是嵌套循环并只保留您需要的:

instances = list()
for r in reservations:
  for ilist in r['Instances']:
    for i in ilist:
      instances.append(i['InstanceId'])  # That's what you looping for

是的,有一些方法可以用较短的代码来实现这一点,但是显式的要比隐式的好,并且坚持你能读到的最好的东西。Python非常擅长迭代,记住维护性第一,性能第二。而且,这一部分很难成为在所有API调用、DB查找等之后所做工作的瓶颈

但是如果你真的坚持要做一行花哨的话,去看看itertools助手,chain.from_iterable()就是你需要的:

from itertools import chain
instances = [i['InstanceId'] for i in chain.from_iterable(r['Instances'] for r in reservations)]

相关问题 更多 >