KeyError при доступе к словарю?
У меня есть словарь json_dict
указанный ниже.
Мне нужно получить доступ к элементу ==> json_dict['OptionSettings'][3]['Value']
.
- pandas.read_csv из строки или данных пакета
- Установить размер переменной точки в matplotlib
- запустить nosetests во всех подкаталогах
- Создание deb или rpm с помощью setuptools - data_files
- Python pickle вызывает cPickle?
Мне нужно получить доступ к элементу с помощью синтаксиса
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" } ] }
2 Solutions collect form web for “KeyError при доступе к словарю?”
К сожалению, вы не можете этого сделать.
Когда вы вводите 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 _
Я не тестировал его, но он должен работать нормально.
(Кроме того, это просто демо-версия, которая поможет вам найти альтернативное решение)
Это сработало для меня
str1="json_dict" params="['OptionSettings'][3]['Value']" str2=str1+params print(eval(str5))
Здесь использование функции eval () является ключом к ее решению.
- Python: как игнорировать строки #comment при чтении в файле
- Создание pdf-латекса с помощью скрипта python