访问未知号码的级联词典

时间:2014-06-27 00:52:22

标签: python dictionary

如果我有字典

dict={'a':{'b':1}}

我用

dict['a']['b']

访问' 1'。但是,如果我的dict是一组未知数字的级联字典(即dict={'a':{'b':{'c':{'d':...}...{'?':1}}...}),我如何循环通过dict来访问最终值?

我一直试图遍历dict,每次构建一个字符串以获取"['a']['b']['c']..."并将此字符串与eval()一起使用,但我无法弄清楚如何利用eval()进行字典访问。

我想做类似伪代码的事情:

x="['a']['b']['c']"
eval(dict[x])

以获取

的值
dict['a']['b']['c']

如果有人有任何其他想法,请分享。谢谢。

2 个答案:

答案 0 :(得分:2)

怎么样:

def get(d, keys):
    for key in keys:
        d = d[key]
    return d

d={'a':{'b':1}}
get(d, ['a', 'b'])

答案 1 :(得分:2)

简而言之:

>>> dct = {"a": {"b": {"c": 1}}}
>>> reduce(dict.get, ["a", "b", "c"], dct)
1

reducedict.get允许"键"喜欢[" a"," b"," c"]

拥有字典dct

>>> dct = {"a": {"b": {"c": 1}}}

我们可以通过get

访问更深层次
>>> dct.get("a")
{'b': {'c': 1}}
>>> dct.get("a").get("b")
{'c': 1}
>>> dct.get("a").get("b").get("c")
1

reduce可以在以前的结果上重复应用一种方法:

>>> reduce(dict.get, ["a", "b", "c"], dct)
1

深钥的概念

如果上述一行方法似乎不适合您的需要,您可以创建访问功能:

>>> def getdeep(dct, deepkey):
...     return reduce(dict.get, deepkey, dct)
...

测试deepkey是否为键列表:

>>> getdeep(dct, ["a", "b"])
{'c': 1}

进入任何级别(假设值存在于那里)

>>> getdeep(dct, ["a", "b", "c"])
1

适用于任何可迭代的,包括可清除的元组:

>>> getdeep(dct, ("a", "b", "c"))
1

并且您可以开始使用表示值的深度地址的变量:

>>> deepkey = ("a", "b", "c")
>>> getdeep(dct, deepkey)
1

setdeep使用reduce

如果我们想使用reduce来修改deepkey指向的值,我们可以这样做,但分两步:

  1. 获取最深的字典(这不是值1,而是{"c": 1}
  2. 设置为" c"这个深层词典的关键是新的价值
  3. 在控制台上看起来像:

    >>> reduce(dict.get, deepkey[:-1], dct)
    {"c": 1}
    >>> reduce(dict.get, deepkey[:-1], dct)[deepkey[-1]] = 99
    >>> dct
    {"a": {"b": {"c": 99}}}
    

    所以setdeep可以写成:

    def setdeep(dct, deepkey, val):
        getdeep(dct, deepkey[:-1])[deepkey[-1]] = val