【问题标题】:KeyError while accessing dictionary?访问字典时出现KeyError?
【发布时间】:2017-01-06 20:43:24
【问题描述】:

我有一本名为json_dict 的字典,如下所示。

我需要访问元素==> json_dict['OptionSettings'][3]['Value']。

我需要使用语法访问元素

print(json_dict[parameter])。

当我给出一个参数比如

param="['OptionSettings'][3]['Value']" 或

param="'OptionSettings'][3]['Value']"

我收到如下错误:

KeyError: "['OptionSettings'][3]['Value']".

我尝试使用以下解决方案,但它只是打印了一个字符串

str1="json_dict"
print(str1+param)

完整词典如下:

{
        "ApplicationName": "Test",
        "EnvironmentName": "ABC-Nodejs",
        "CNAMEPrefix": "ABC-Neptune",
        "SolutionStackName": "64bit Amazon Linux 2016.03 v2.1.1 running Node.js",
        "OptionSettings": [
                           {
                            "Namespace": "aws:ec2:vpc",
                            "OptionName": "AssociatePublicIpAddress",
                            "Value": "true"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:environment",
                            "OptionName": "EnvironmentType",
                            "Value": "LoadBalanced"
                            },
                           {
                            "Namespace": "aws:ec2:vpc",
                            "OptionName": "Subnets",
                            "Value": "param1"
                            },
                           {
                            "Namespace": "aws:autoscaling:launchconfiguration",
                            "OptionName": "SecurityGroups",
                            "Value": "param2"
                            },
                           {
                            "Namespace": "aws:autoscaling:asg",
                            "OptionName": "MinSize",
                            "Value": "1"
                            },
                           {
                            "Namespace": "aws:autoscaling:asg",
                            "OptionName": "MaxSize",
                            "Value": "4"
                            },
                           {
                            "Namespace": "aws:autoscaling:asg",
                            "OptionName": "Availability Zones",
                            "Value": "Any"
                            },
                           {
                            "Namespace": "aws:autoscaling:asg",
                            "OptionName": "Cooldown",
                            "Value": "360"
                            },
                           {
                            "Namespace": "aws:autoscaling:launchconfiguration",
                            "OptionName": "IamInstanceProfile",
                            "Value": "NepRole"
                            },
                           {
                            "Namespace": "aws:autoscaling:launchconfiguration",
                            "OptionName": "MonitoringInterval",
                            "Value": "5 minutes"
                            },
                           {
                            "Namespace": "aws:autoscaling:launchconfiguration",
                            "OptionName": "RootVolumeType",
                            "Value": "gp2"
                            },
                           {
                            "Namespace": "aws:autoscaling:launchconfiguration",
                            "OptionName": "RootVolumeSize",
                            "Value": "10"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:sns:topics",
                            "OptionName": "Notification Endpoint",
                            "Value": "sunil.kumar2@pb.com"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:hostmanager",
                            "OptionName": "LogPublicationControl",
                            "Value": "false"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:command",
                            "OptionName": "DeploymentPolicy",
                            "Value": "Rolling"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:command",
                            "OptionName": "BatchSizeType",
                            "Value": "Percentage"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:command",
                            "OptionName": "BatchSize",
                            "Value": "100"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:command",
                            "OptionName": "HealthCheckSuccessThreshold",
                            "Value": "Ok"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:command",
                            "OptionName": "IgnoreHealthCheck",
                            "Value": "false"
                            },
                           {
                            "Namespace": "aws:elasticbeanstalk:command",
                            "OptionName": "Timeout",
                            "Value": "600"
                            },
                           {
                            "Namespace": "aws:autoscaling:updatepolicy:rollingupdate",
                            "OptionName": "RollingUpdateEnabled",
                            "Value": "false"
                            },
                           {
                            "Namespace": "aws:ec2:vpc",
                            "OptionName": "ELBSubnets",
                            "Value": "param3"
                            },
                           {
                            "Namespace": "aws:elb:loadbalancer",
                            "OptionName": "SecurityGroups",
                            "Value": "param4"
                            },
                           {
                            "Namespace": "aws:elb:loadbalancer",
                            "OptionName": "ManagedSecurityGroup",
                            "Value": "param4"
                            }
                           ]

}

【问题讨论】:

    标签: python json python-2.7 python-3.x dictionary


    【解决方案1】:

    很遗憾,您不能这样做。

    当您输入param="['OptionSettings'][3]['Value']" 然后输入json_dict[param] 时,您基本上是在询问由不存在的键"['OptionSettings'][3]['Value']" 表示的值。

    您必须在关卡中导航,直到到达最后一个。


    当然,如果您需要单线,您始终可以创建一些逻辑并将其提取到方法中。

    例如,代替

    print(json_dict[param]). 
    

    你可以使用类似的东西

    print(get_json_value(json_dict, param))
    

    并定义一个函数如

    import re
    
    def get_json_value(json_dict, params):
        list_of_params = re.findall(r'\[([^]]*)\]', params)
        #list_of_params = ['OptionSettings', '3', 'Value']
    
        _ = json_dict
        for elem in list_of_params:
             _ = _[elem]
        return _
    

    我还没有测试它,但它应该可以正常工作。
    (另外,这只是一个演示,用于指导您完成替代解决方案)

    【讨论】:

      【解决方案2】:

      这对我有用

      str1="json_dict"
      params="['OptionSettings'][3]['Value']"
      str2=str1+params
      print(eval(str5))
      

      这里使用函数eval()是解决这个问题的关键。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多