如何在Python中搜索此嵌套字典中的特定键?

时间:2018-04-05 01:53:47

标签: python python-3.x dictionary nested amazon-mws

我是编程新手,我试图从亚马逊MWS API中提取值。它返回了我见过的最大的嵌套词典,我无法弄清楚如何循环查找我需要的值。

示例:

{'Products': {'Product': {'AttributeSets': {'ItemAttributes': {'Binding': {'value': 'Video '
                                                                                'Game'},
                                                           'Brand': {'value': 'Nintendo'},
                                                           'Color': {'value': 'blue'},
                                                           'ESRBAgeRating': {'value': 'Everyone'},
                                                           'HardwarePlatform': {'value': 'Android/iOS'},
                                                           'IsAdultProduct': {'value': 'false'},
                                                           'ItemDimensions': {'Height': {'Units': {'value': 'inches'},
                                                                                         'value': '5.00'},
                                                                              'Length': {'Units': {'value': 'inches'},
                                                                                         'value': '5.00'},
                                                                              'Weight': {'Units': {'value': 'pounds'},
                                                                                         'value': '0.10'},
                                                                              'Width': {'Units': {'value': 'inches'},
                                                                                        'value': '2.00'}},
                                                           'Label': {'value': 'Nintendo'},
                                                           'Languages': {'Language': {'Name': {'value': 'english'},
                                                                                      'Type': {'value': 'Unknown'}}},
                                                           'ListPrice': {'Amount': {'value': '34.99'},
                                                                         'CurrencyCode': {'value': 'USD'}},
                                                           'Manufacturer': {'value': 'Nintendo'},
                                                           'Model': {'value': 'PMCAPBAA'},
                                                           'OperatingSystem': [{'value': 'Not '
                                                                                         'Machine '
                                                                                         'Specific'},
                                                                               {'value': 'Android/iOS'}],
                                                           'PackageDimensions': {'Height': {'Units': {'value': 'inches'},
                                                                                            'value': '1.00'},
                                                                                 'Length': {'Units': {'value': 'inches'},
                                                                                            'value': '5.10'},
                                                                                 'Weight': {'Units': {'value': 'pounds'},
                                                                                            'value': '0.04'},
                                                                                 'Width': {'Units': {'value': 'inches'},
                                                                                           'value': '2.90'}},
                                                           'PackageQuantity': {'value': '1'},
                                                           'PartNumber': {'value': 'PMCAPBAA'},
                                                           'Platform': [{'value': 'Not '
                                                                                  'Machine '
                                                                                  'Specific'},
                                                                        {'value': 'Android'},
                                                                        {'value': 'iOS'},
                                                                        {'value': 'Nintendo '
                                                                                  'Wii'}],
                                                           'ProductGroup': {'value': 'Video '
                                                                                     'Games'},
                                                           'ProductTypeName': {'value': 'VIDEO_GAME_ACCESSORIES'},
                                                           'Publisher': {'value': 'Nintendo'},
                                                           'ReleaseDate': {'value': '2016-09-16'},
                                                           'SmallImage': {'Height': {'Units': {'value': 'pixels'},
                                                                                     'value': '75'},
                                                                          'URL': {'value': 'http://ecx.images-amazon.com/images/I/41%2B1-PwEz4L._SL75_.jpg'},
                                                                          'Width': {'Units': {'value': 'pixels'},
                                                                                    'value': '75'}},
                                                           'Studio': {'value': 'Nintendo'},
                                                           'Title': {'value': 'Nintendo '
                                                                              'Pokemon '
                                                                              'Go '
                                                                              'Plus'},
                                                           'lang': {'value': 'en-US'}}},
                      'Identifiers': {'MarketplaceASIN': {'ASIN': {'value': 'B01H482N6E'},
                                                          'MarketplaceId': {'value': 'ATVPDKIKX0DER'}}},
                      'Relationships': {},
                      'SalesRankings': {'SalesRank': [{'ProductCategoryId': {'value': 'video_games_display_on_website'},
                                                       'Rank': {'value': '35'}},
                                                      {'ProductCategoryId': {'value': '14218821'},
                                                       'Rank': {'value': '1'}},
                                                      {'ProductCategoryId': {'value': '471304'},
                                                       'Rank': {'value': '22'}}]}}}}

如何找到'标题'的价值?或者什么是找到价值的最佳方式' Title'从这本词典?

当我尝试在Stackoverflow上实现类似的递归解决方案时,我得到一个None值。

我试过了:

def recursive_lookup(k, d):
    if k in d:
        return d[k]
    for v in d.values():
        if isinstance(v, dict):
            return recursive_lookup(k, v)
    return None

print(recursive_lookup('Title', productData.parsed))

2 个答案:

答案 0 :(得分:3)

您的代码存在的问题是您没有回溯到其他词典。在返回之前,不要遍历所有项目。通过返回你切断你的循环。

下面的代码循环遍历所有的dicts,直到它找到了密钥或者它已经检查了所有的dicts并且什么都没找到之后才返回。

def recursive_lookup(k, d):
    if k in d: return d[k]
    for v in d.values():
        if isinstance(v, dict):
            a = recursive_lookup(k, v)
            if a is not None: return a
    return None

答案 1 :(得分:1)

您可以在每次递归调用时使用dict.items

def get_value(d, target = 'Title'):
  val = filter(None, [[b] if a == target else get_value(b) if isinstance(b, dict) else None for a, b in d.items()])
  return [i for b in val for i in b]

print(get_value(structure))

输出:

[{'value': 'Nintendo Pokemon Go Plus'}]