Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python在深度嵌套的结构中收集特定值_Python_For Loop_Nested Loops - Fatal编程技术网

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

如何使用Python在深度嵌套的结构中收集特定值,python,for-loop,nested-loops,Python,For Loop,Nested Loops,我试图在python脚本中使用boto3 api从description\u instances调用中获取实例ID列表。对于那些不了解aws的人,如果需要,我可以在删除细节后发布详细代码。我正试图从这样的结构中访问一个项 u'Reservations':[ { u'Instances':[ { u'InstanceId':'i-0000ffffdd' },

我试图在python脚本中使用boto3 api从
description\u instances
调用中获取实例ID列表。对于那些不了解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
仅供参考:my
reservations
变量包含
u'reservations'的整个列表:


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

您的解决方案实际上并没有那么低效,只是您实际上不必创建所有顶级列表来最终保存实例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
from itertools import chain
instances = [i['InstanceId'] for i in chain.from_iterable(r['Instances'] for r in reservations)]
是的,有一些方法可以用较短的代码来实现这一点,但显式的比隐式的好,并且坚持你能读得最好的。Python非常擅长迭代,记住可维护性第一,性能第二。此外,这一部分很难成为您在所有API调用、DB查找等之后所做工作的瓶颈

但是如果你真的坚持要做一行漂亮的代码,那就去看看助手,
chain.from\u iterable()
就是你需要的:

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
from itertools import chain
instances = [i['InstanceId'] for i in chain.from_iterable(r['Instances'] for r in reservations)]

谢谢你的详细解释。当我指的是“高效”时,我并不是指一行代码,但我仍然会研究itertools帮助程序,它看起来很复杂。我一直在寻找减少多行/for循环的方法,而你的答案正好做到了这一点,尽管我不得不删除一行。删除答案中的最后一个for循环并直接访问instances.append(ilist['InstanceId')
和关于可维护性的建议部分——这是可靠的建议。再次感谢你。