如何使用 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 新手,我真的认为必须有一些更好的方法来做到这一点,而不是多个 for
和 if
。有一个更好的方法吗?请指出 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)]
我正在尝试在我的 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 新手,我真的认为必须有一些更好的方法来做到这一点,而不是多个 for
和 if
。有一个更好的方法吗?请指出 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)]