-2

我有一本字典,我需要找到一个键的值。以下命令未返回预期值“mar5-deliveryreport-new”

>>> mydict['ClusterIdentifier']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'ClusterIdentifier'

>>> mydict
{u'DescribeClustersResponse': {u'DescribeClustersResult': {u'Marker': None, u'Clusters': [{u'PubliclyAccessible': True, u'MasterUsername': u'root', u'VpcSecurityGroups': [], u'ModifyStatus': None, u'NumberOfNodes': 1, u'PendingModifiedValues': {u'NodeType': None, u'ClusterType': None, u'MasterUserPassword': None, u'AutomatedSnapshotRetentionPeriod': None, u'ClusterVersion': None, u'NumberOfNodes': None}, u'VpcId': None, u'ClusterVersion': u'1.0', u'AutomatedSnapshotRetentionPeriod': 1, u'ClusterParameterGroups': [{u'ParameterApplyStatus': u'in-sync', u'ParameterGroupName': u'default.redshift-1.0'}], u'DBName': u'mydb', u'PreferredMaintenanceWindow': u'tue:08:00-tue:08:30', u'Endpoint': {u'Port': 5439, u'Address': u'mar5-deliveryreport-new.lc.us-east-1.redshift.amazonaws.com'}, u'RestoreStatus': {u'Status': u'completed', u'ProgressInMegaBytes': 804307, u'CurrentRestoreRateInMegaBytesPerSecond': 57.3072319201995, u'EstimatedTimeToCompletionInSeconds': 0, u'ElapsedTimeInSeconds': 14035, u'SnapshotSizeInMegaBytes': 804307}, u'AllowVersionUpgrade': True, u'ClusterCreateTime': 1381812358.833, u'ClusterSubnetGroupName': None, u'ClusterSecurityGroups': [{u'Status': u'active', u'ClusterSecurityGroupName': u'default'}], u'ClusterIdentifier': u'mar5-deliveryreport-new', u'AvailabilityZone': u'us-east-1a', u'NodeType': u'dw.hs1.xlarge', u'Encrypted': False, u'ClusterStatus': u'available'}]}, u'ResponseMetadata': {u'RequestId': u'233f495b-3576-11e3-83ff-d332123c25c4'}}}

>>> type(mydict)
<type 'dict'>
4

4 回答 4

1

您无法访问它,因为您尝试访问它的方式都是错误的。

>>> import pprint
>>> pprint.pprint(mydict)
{'DescribeClustersResponse': {'DescribeClustersResult': {'Clusters': [{'AllowVersionUpgrade': True,
                                                                       'AutomatedSnapshotRetentionPeriod': 1,
                                                                       'AvailabilityZone': 'us-east-1a',
                                                                       'ClusterCreateTime': 1381812358.833,
                                                                       'ClusterIdentifier': 'mar5-deliveryreport-new',
                                                                       'ClusterParameterGroups': [{'ParameterApplyStatus': 'in-sync',
                                                                                                   'ParameterGroupName': 'default.redshift-1.0'}],
                                                                       'ClusterSecurityGroups': [{'ClusterSecurityGroupName': 'default',
                                                                                                  'Status': 'active'}],
                                                                       'ClusterStatus': 'available',
                                                                       'ClusterSubnetGroupName': None,
                                                                       'ClusterVersion': '1.0',
                                                                       'DBName': 'mydb',
                                                                       'Encrypted': False,
                                                                       'Endpoint': {'Address': 'mar5-deliveryreport-new.lc.us-east-1.redshift.amazonaws.com',
                                                                                    'Port': 5439},
                                                                       'MasterUsername': 'root',
                                                                       'ModifyStatus': None,
                                                                       'NodeType': 'dw.hs1.xlarge',
                                                                       'NumberOfNodes': 1,
                                                                       'PendingModifiedValues': {'AutomatedSnapshotRetentionPeriod': None,
                                                                                                 'ClusterType': None,
                                                                                                 'ClusterVersion': None,
                                                                                                 'MasterUserPassword': None,
                                                                                                 'NodeType': None,
                                                                                                 'NumberOfNodes': None},
                                                                       'PreferredMaintenanceWindow': 'tue:08:00-tue:08:30',
                                                                       'PubliclyAccessible': True,
                                                                       'RestoreStatus': {'CurrentRestoreRateInMegaBytesPerSecond': 57.3072319201995,
                                                                                         'ElapsedTimeInSeconds': 14035,
                                                                                         'EstimatedTimeToCompletionInSeconds': 0,
                                                                                         'ProgressInMegaBytes': 804307,
                                                                                         'SnapshotSizeInMegaBytes': 804307,
                                                                                         'Status': 'completed'},
                                                                       'VpcId': None,
                                                                       'VpcSecurityGroups': []}],
                                                         'Marker': None},
                              'ResponseMetadata': {'RequestId': '233f495b-3576-11e3-83ff-d332123c25c4'}}}
>>> mydict['DescribeClustersResponse']['DescribeClustersResult']['Clusters'][0]['ClusterIdentifier']
'mar5-deliveryreport-new'
于 2013-10-15T09:04:20.770 回答
1

嗯……你看到的有点意料之中。您正在查询的字典中没有这样的键。

问题是如果您知道您在字典中搜索的关键字,您可以检查它是否存在并快速检索它。但是,在您的情况下,您不能简单地查找固定键,因为您不知道它放在哪个子词典中。

在一般情况下,您需要遍历整个槽dict,这可能非常慢。您应该在当前问题状态下查看的内容是:Finding a key recursive in a dictionary。仍然可能会出现一些问题,例如当底层结构中出现不止一次键时该怎么办,或者您是否应该遍历列表等...

或者您需要提供整个“路径”到您希望密钥存在的字典 Eg mydict[u'ClusterIdentifier'][u'DescribeClustersResult'][u'Clusters'][0][u'ClusterIdentifier']

于 2013-10-15T09:04:27.277 回答
1

对于'Address'键的值,你需要这样写

myDict['DescribeClustersResponse']['DescribeClustersResult']['Clusters'][0]['Endpoint']['Address']

它会给你你想要的。希望这会帮助你。

于 2013-10-15T09:08:04.970 回答
1

您必须调整您的期望,因为该字典根本不包含该键。我猜你正在处理一些 JSON-RPC 结果或类似结果,而 mydict 中唯一的键是u'DescribeClustersResponse'.

很多时候,像这样的分层结构是有原因的。在这种情况下,例如,mydict[u'DescribeClustersResponse'][u'DescribeClustersResult'][u'Clusters']是一个列表,表明可能存在多个描述的集群。因此,即使您确实有一个例程来深入搜索 ClusterIdentifier,您仍然必须遍历任意数量的它们,并且无论如何都可能想要关联的数据。

此外,该词典的默认打印样式非常难以阅读。pprint是你的朋友:

import pprint
pprint.pprint(mydict)
于 2013-10-15T09:08:24.387 回答