2013-10-15 90 views
-2

我有一本字典,我需要找到一个键的值。下面的命令不会返回预期值“mar5-deliveryreport新”从嵌套字典中查找值

>>> 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'> 
+2

你的钥匙用法是错误的。这将用于你在这里给出的例子。 mydict [''DescribeClustersResponse] ['DescribeClustersResult'] ['Clusters'] [0] ['ClusterIdentifier'] –

回答

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' 
1

嗯...你看到的是有点期待。你正在查询的字典中没有这样的密钥。

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

在一般情况下,您需要遍历整个dict,这可能非常缓慢。你应该关注的问题是:Finding a key recursively in a dictionary。还有一些问题可能会出现,比如在底层结构中出现多次关键字时该怎么办,或者是否应该遍历列表等等......

或者您需要提供整个“路径”到字典你期望关键的存在例如mydict[u'ClusterIdentifier'][u'DescribeClustersResult'][u'Clusters'][0][u'ClusterIdentifier']

1

对于“地址”项的值,就需要这种方式

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

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

1

您必须调整您的期望,因为该字典不包含该密钥。我猜你正在处理一些JSON-RPC结果或类似的结果,并且唯一存在于mydict中的关键字是u'DescribeClustersResponse'

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

此外,该字典的默认打印样式是相当不可读的。 pprint是你的朋友:

import pprint 
pprint.pprint(mydict)