如何使用Python在深度嵌套的结构中收集特定值
我试图在python脚本中使用boto3 api从如何使用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' },
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
仅供参考:myreservations
变量包含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')
和关于可维护性的建议部分——这是可靠的建议。再次感谢你。