我有一个json对象,我从一个调用返回,类似于:
{
'Tags': [
{
'Key': 'Dept',
'PropagateAtLaunch': True,
'ResourceId': 'my-auto-scaling-group',
'ResourceType': 'auto-scaling-group',
'Value': 'Research',
},
{
'Key': 'Role',
'PropagateAtLaunch': True,
'ResourceId': 'my-auto-scaling-group',
'ResourceType': 'auto-scaling-group',
'Value': 'WebServer',
},
{
'Key': 'ecs_scaling',
'PropagateAtLaunch': True,
'ResourceId': 'my-auto-scaling-group',
'ResourceType': 'auto-scaling-group',
'Value': 'true',
},
],
'ResponseMetadata': {
'...': '...',
},
}
除了标准之外,是否存在更简单地确定密钥ecs_scaling
是否存在的Pythonic方法:
data = json.loads(theThing)
for key in data.items():
...
Key可能是第一项,它可能是第40项 - 理想情况下我希望能够做if 'ecs_scaling' in theKeys: ...
之类的事情吗?
答案 0 :(得分:4)
您可以使用内置any
。
Return True if any element of the iterable is true. If the iterable is empty, return False.
if any(tag['key'] == 'ecs_scaling' for tag in data['Tags']):
...
答案 1 :(得分:3)
复杂性已经是线性的,所以你唯一能想到的就是哈希搜索。 但是,构造哈希集或哈希表需要线性复杂度。
因此,除非您从json
模块调用的函数已经构建了这样的哈希集,否则迭代是您可以做的最好的事情,对于线性复杂度,即O(n)
。
在这方面,我认为最Pythonic的方法是使用内置的any
,另一方已经提到过。
为了完整起见,尽管性能较差,但你也可以使用列表理解,这通常被视为"高度Pythonic":
'ecs_scaling' in [item['Key'] for item in data.items()]
这不太好,因为必须构建一个额外的列表,这需要对整个数据进行迭代。
答案 2 :(得分:2)
any(el['Key'] == 'ecs_scaling' for el in data['Tags'])
答案 3 :(得分:0)
我在想是否有另一种方法可以做到这一点。虽然它有点滑稽;但它会工作并减少调用任何build-in
方法。但是,我怀疑我是否符合以pythonic方式进行此操作的标准。
但是,我肯定会考虑Key
及其值ecs_scaling
将存在于所需的数据部分,即Tags
。除此之外,模式应该被修复,否则解决方案将无法正常工作,例如"Key": "ecs_scaling"
我认为如果它是一个字典,那么它来之前就是字符串。
只需使用str.find
,但您可能需要两次调用以确保获得理想的结果。
if data.find("'Key': 'ecs_scaling'") != -1 or data.find('"Key": "ecs_scaling"') != -1
但如果我们在检查整个数据集之前忽略不检查是否存在的缺陷,那么any
是最好的解决方案之一。