KeyError при доступе к словарю?

У меня есть словарь 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" } ] } 

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 () является ключом к ее решению.

  • многопроцессорная обработка и потоковая передача с использованием asyncio в Python 3.4
  • Невозможно очистить конкретную таблицу с помощью BeautifulSoup4 (Python 3)
  • PermissionError: в python
  • Как написать функцию, чтобы подсчитать, сколько раз символ появляется в строке?
  • функции и атрибуты класса (python)
  • Почему dict-ключи поддерживают вычитание списка, но не вычитание кортежа?
  • Невозможный lookbehind с обратной рецензией
  • Как узнать Python 2, если я уже знаю Python 3?
  • Python - лучший язык программирования в мире.