【问题标题】:finding value from nested dictionary从嵌套字典中查找值
【发布时间】:2013-10-23 00:15:53
【问题描述】:

我有一本字典,我需要找到一个键的值。以下命令未返回预期值“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'>

【问题讨论】:

  • 您的密钥使用错误。这适用于您在此处给出的示例。 mydict[''DescribeClustersResponse]['DescribeClustersResult']['Clusters'][0]['ClusterIdentifier']

标签: python dictionary


【解决方案1】:

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

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

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

或者您需要为您希望密钥存在的字典提供完整的“路径”,例如mydict[u'ClusterIdentifier'][u'DescribeClustersResult'][u'Clusters'][0][u'ClusterIdentifier'].

【讨论】:

    【解决方案2】:

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

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

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

    import pprint
    pprint.pprint(mydict)
    

    【讨论】:

      【解决方案3】:

      'Address'键的值,需要这样写

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2022-10-12
          • 2021-11-30
          • 2015-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-05
          • 2011-08-30
          • 2020-02-16
          相关资源
          最近更新 更多