Python 从嵌套字典中查找值
我有一本字典,我需要找到一个键的值。以下命令不返回预期值“mar5 deliveryreport new” mydict['ClusterIdentifier'] 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 KeyError:“ClusterIdentifier” >>>麦迪克特 {u'DescribeClusterResponse':{u'Marker':无,u'Clusters':[{u'PubliclyAccessible':True,u'MasterUsername':u'root',u'VPCSecurityGroup':[],u'ModifyStatus':无,u'NumberOfNodes':1,u'PendingModifiedValue':{u'NodeType':无,u'ClusterType':无,u'MasterUserPassword':无,u'AutomatedSnapshotRetentionPeriod':无,u'ClusterVersion':无},u'NumberOfNodes':无,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'EstimatedTimeCompletionInSeconds':0,u'ElapsedTimeInSeconds':14035,u'SnapshotSizeInMegaBytes':804307},u'AllowVersionUpgrade':True,u'ClusterCreateTime':13812358.833,u'ClusterSubnetGroupName':无,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'}} >>>类型(mydict)Python 从嵌套字典中查找值,python,dictionary,Python,Dictionary,我有一本字典,我需要找到一个键的值。以下命令不返回预期值“mar5 deliveryreport new” mydict['ClusterIdentifier'] 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 KeyError:“ClusterIdentifier” >>>麦迪克特 {u'DescribeClusterResponse':{u'Marker':无,u'Clusters':[{u'PubliclyAccessible':True,u'MasterUsername':u'ro
您无法访问它,因为您尝试访问它的方式完全错误
>>> 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'
嗯……你看到的有些出乎意料。你正在查询的词典中没有这样的关键字 问题是,如果您知道在字典中搜索的键,您可以检查它是否存在并快速检索。但是,在您的情况下,您不能简单地查找固定键,因为您不知道它放在哪个子字典中 在一般情况下,您需要遍历整个
dict
,这可能会非常慢。在问题的当前状态下,您应该注意以下几点:。仍然可能会出现一些问题,例如当基础结构中出现多个键时该怎么办,或者是否遍历列表等
或者,您需要提供期望键存在的字典的完整“路径”,例如,mydict[u'ClusterIdentifier'][u'DescribeClustersResult'][u'Clusters'][0][u'ClusterIdentifier']对于“Address”键的值,您需要这样写
myDict['DescribeClustersResponse']['DescribeClustersResult']['Clusters'][0]['Endpoint']['Address']
它会给你你想要的。希望这会对你有所帮助。你必须调整你的期望值,因为该字典根本不包含该键。我猜你正在处理一些JSON-RPC结果或类似结果,mydict中唯一的键是
u'DescribeClusterResponse'
像这样的层次结构常常是有原因的。例如,在这种情况下,mydict[u'descripbeclustersresponse'][u'descripbeclustersresult'][u'Clusters']
是一个列表,表明可能描述了多个集群。因此,即使您有一个例程来深入搜索ClusterIdentifier,您仍然需要遍历任意数量的集群,并且可能仍然需要关联的数据
此外,该词典的默认打印样式也不可读。pprint
是您的朋友:
import pprint
pprint.pprint(mydict)
您的密钥用法错误。这适用于您在此处给出的示例。mydict[''DescribeClusterResponse]['DescribeClusterResult']['Clusters'][0]['ClusterIdentifier']
import pprint
pprint.pprint(mydict)