使用列表从嵌套字典中获取值

时间:2018-02-15 20:03:37

标签: python python-3.x

我有几个字典看起来像这样:

myDict = {
    "main": {
        "foo": {
            "xyz": "lorem",
            "abc": "ipsum"
        },
        "bar": {
            "xyz": "dolor",
            "abc": "sit"
        }
    }
}

如何使用给定列表(例如["main", "foo", "xyz"]["main", "bar", "abc"])作为导航嵌套词典的键来检索这些值?

因此它会将myDict["main", "foo", "xyz"]解释为myDict["main"]["foo"]["xyz"]

4 个答案:

答案 0 :(得分:3)

from functools import reduce
def path_lookup(my_dict, path):
  return reduce(lambda d, ks: d[ks], path, my_dict)

print(path_lookup(myDict, ["main", "bar", "abc"])) # prints sit

如果您真的希望字典在编辑中指示响应元组索引,则可以通过覆盖__getitem__来实现,但您可能不希望这样做。

答案 1 :(得分:3)

您可以使用以下功能:

def lookup(theDict, theKeys):
    val = theDict
    for akey in theKeys:
        val = val[akey]
    return val

答案 2 :(得分:1)

也可以这样做:

def func(d, l):
    while l:
        d = d[l.pop(0)]
    return d

print(func(myDict,["main","foo","xyz"]))

返回:

'lorem'

或者如上所述:

def func(d, l):
    for k in l:
        d = d[k]
    return d

答案 3 :(得分:0)

你可以简单地使用循环:

query = ["main", "foo", "xyz"]
myDict = {
    "main": {
        "foo": {
            "xyz": "lorem",
            "abc": "ipsum"
        },
        "bar": {
            "xyz": "dolor",
            "abc": "sit"
        }
    }
}
subdict = myDict
for key in query:
    if key in subdict.keys():
        subdict = subdict[key]
    else:
        print("Invalid query!")
        break
value = subdict