用pythonic方法判断json对象是否包含某个值?

时间:2017-08-30 15:17:19

标签: python python-2.7

我有一个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: ...之类的事情吗?

4 个答案:

答案 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是最好的解决方案之一。