搜索一个值并获取父字典名称(键):
Search for a value and get the parent dictionary names (keys):
Dictionary = {dict1:{ 'part1': { '.wbxml': 'application/vnd.wap.wbxml', '.rl': 'application/resource-lists+xml', }, 'part2': {'.wsdl': 'application/wsdl+xml', '.rs': 'application/rls-services+xml', '.xop': 'application/xop+xml', '.svg': 'image/svg+xml', }, 'part3':{...}, ... dict2:{ 'part1': { '.dotx': 'application/vnd.openxmlformats-..' '.zaz': 'application/vnd.zzazz.deck+xml', '.xer': 'application/patch-ops-error+xml',} }, 'part2':{...}, 'part3':{...},... },...在上面的字典中,我需要搜索如下值:"image/svg+xml".其中,字典中没有重复任何值.如何搜索"image/svg+xml"?以便它应该返回字典中的父键 { dict1:"part2" }.
In above dictionary I need to search values like: "image/svg+xml". Where, none of the values are repeated in the dictionary. How to search the "image/svg+xml"? so that it should return the parent keys in a dictionary { dict1:"part2" }.
请注意:解决方案应该未经修改适用于 Python 2.7 和 Python 3.3.
Please note: Solutions should work unmodified for both Python 2.7 and Python 3.3.
推荐答案这是对嵌套 dict 的迭代遍历,另外还跟踪导致特定点的所有键.因此,只要您在 dicts 中找到正确的值,您就已经拥有获取该值所需的键.
This is an iterative traversal of your nested dicts that additionally keeps track of all the keys leading up to a particular point. Therefore as soon as you find the correct value inside your dicts, you also already have the keys needed to get to that value.
如果您将下面的代码放在 .py 文件中,它将按原样运行.find_mime_type(...) 函数返回键序列,这些键将使您从原始字典中找到您想要的值.demo() 函数展示了如何使用它.
The code below will run as-is if you put it in a .py file. The find_mime_type(...) function returns the sequence of keys that will get you from the original dictionary to the value you want. The demo() function shows how to use it.
d = {'dict1': {'part1': {'.wbxml': 'application/vnd.wap.wbxml', '.rl': 'application/resource-lists+xml'}, 'part2': {'.wsdl': 'application/wsdl+xml', '.rs': 'application/rls-services+xml', '.xop': 'application/xop+xml', '.svg': 'image/svg+xml'}}, 'dict2': {'part1': {'.dotx': 'application/vnd.openxmlformats-..', '.zaz': 'application/vnd.zzazz.deck+xml', '.xer': 'application/patch-ops-error+xml'}}} def demo(): mime_type = 'image/svg+xml' try: key_chain = find_mime_type(d, mime_type) except KeyError: print ('Could not find this mime type: {0}'.format(mime_type)) exit() print ('Found {0} mime type here: {1}'.format(mime_type, key_chain)) nested = d for key in key_chain: nested = nested[key] print ('Confirmation lookup: {0}'.format(nested)) def find_mime_type(d, mime_type): reverse_linked_q = list() reverse_linked_q.append((list(), d)) while reverse_linked_q: this_key_chain, this_v = reverse_linked_q.pop() # finish search if found the mime type if this_v == mime_type: return this_key_chain # not found. keep searching # queue dicts for checking / ignore anything that's not a dict try: items = this_v.items() except AttributeError: continue # this was not a nested dict. ignore it for k, v in items: reverse_linked_q.append((this_key_chain + [k], v)) # if we haven't returned by this point, we've exhausted all the contents raise KeyError if __name__ == '__main__': demo()输出:
在这里找到图像/svg+xml mime 类型:['dict1', 'part2', '.svg']
Found image/svg+xml mime type here: ['dict1', 'part2', '.svg']
确认查找:image/svg+xml
Confirmation lookup: image/svg+xml
更多推荐
在嵌套字典 python 中搜索值
发布评论