根据值返回字典名称

时间:2016-05-03 14:30:32

标签: python python-3.x dictionary

我是python的新手,我想对字典进行反向查找。我有一个从JSON文件构建的字典,看起来类似于:

{
    "dict1" : {
        "data1" : "a",
        "data2" : "b",
        "data3" : "c",
        "data4" : "d",
        "data5" : "e"
    },
    "dict2" : {
        "data1" : "f",
        "data2" : "g",
        "data3" : "h",
        "data4" : "i",
        "data5" : "j"
    }

}

如果我想知道哪个词典'dict1'或'dict2'包含值j,假设所有值都是唯一的。

2 个答案:

答案 0 :(得分:2)

除非我的JSON知识让我失望,否则看起来你实际上在某个词典中有一个词典?解决这个问题的一个简单方法是将这些dict对象提取到单独的变量中,假设你将它们提取到“d1”和“d2”中。

我们可以看到python中的字典是否包含具有以下代码行的特定值:

MATCH 1
    > 1.    [69-87]     `0x000000000B0D9A20`
    > 2.    [130-148]   `0x00000000846F4900` 
MATCH 2
    > 1.    [288-306]   `0x000000000296F1E8`
    > 2.    [317-326]   `<unknown>` 
MATCH 3
    > 1.    [466-484]   `0x0000000030A0C590`
    > 2.    [495-504]   `<unowned>`

如果“j”是字典中任何键的值,则返回true。如果您在示例中的顶级字典上执行此操作它将无法工作,您将需要编写额外的代码以递归搜索分配给顶级字典中的键的字典。

因此,将字典提取到单独的变量中会更容易,然后在if语句中调用上面的代码行来确定该值是否在字典中。您需要以某种方式跟踪每个字典,遍历这些字典并存储每个字典是否包含您的值。

答案 1 :(得分:1)

拥有词典字典确实不是问题,假设您的数据结构已经建立,并且您知道您将在何种深度找到事物。然而,如果结构比你的结构更深,那么事情会变得复杂。您问题的简单解决方案是:

#!/usr/bin/env python3

json_dict = {
    "dict1": {
        "data1": "a",
        "data2": "b",
        "data3": "c",
        "data4": "d",
        "data5": "e"
    },
    "dict2": {
        "data1": "f",
        "data2": "g",
        "data3": "h",
        "data4": "i",
        "data5": "j"
    },
    "dict3": {
        "data42": "c",
        "data43": "g"
    }
}


def which_dict_key(value, dicts):
    '''
    Return a list of keys for a dictionary where the
    value dictionary for that key includes the value
    provided.
    '''

    return [key for key in dicts if value in dicts[key].values()]

if __name__ == '__main__':
    print(which_dict_key("j", json_dict))
    print(which_dict_key("c", json_dict))
    print(which_dict_key("q", json_dict))
    print(which_dict_key("g", json_dict))

产生:

['dict2']
['dict1', 'dict3']
[]
['dict3', 'dict2']