我是编程新手,我试图从亚马逊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))
答案 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'}]