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

How to collect specific values in a deeply nested structure with Python

我正在尝试在我的 python 脚本中使用 boto3 api 获取从 describe_instances 调用中获取的实例 ID 列表。对于那些不了解 aws 的人,如果需要,我可以 post 删除细节后的详细代码。我正在尝试从这样的结构访问项目

   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。有一个更好的方法吗?请指出 structure/method 等,这可能对我的场景有用

您的解决方案实际上并没有那么低效,只是您实际上不必为了最后保存实例 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 调用、数据库查找等之后所做工作的瓶颈

不过如果你真的非要做花哨的一行,那就去看看itertools助手,chain.from_iterable()就是你需要的:

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