当事先不知道层次结构中的键位置时,如何访问嵌套的 Python 字典键值对?

Posted

技术标签:

【中文标题】当事先不知道层次结构中的键位置时,如何访问嵌套的 Python 字典键值对?【英文标题】:How to access a nested Python dictionary key-value pair when the key location in the hierarchy is not known in advance? 【发布时间】:2019-10-23 10:21:17 【问题描述】:

我有一个嵌套的 Python 字典,需要将某个键设置为某个值。例如,

x['key1']['key2']['key3'] = value

如果我事先知道层次结构,这将有效。不是这种情况。我正在寻找一种可以在运行时指定的寻址方案,例如“key1/key2/key3”,以访问所需的键值对。有什么建议吗?

【问题讨论】:

【参考方案1】:

作为一种方法的开始,您可以将'key1/key2/key3' 之类的字符串解析为可以执行您想要的操作的函数。例如:

# Assuming for this example that s is just a `/`-delimted string of keys.
def make_getter(s):
    keys = s.split("/")
    def _(d):
        rv = d
        for k in keys:
            try:
                rv = rv.get(k)
            except AttributeError:
                rv = None
                break
        return rv
    return d

然后

>>> accessor = make_getter("foo/bar/baz")
>>> accessor('foo': 'bar': 'baz': 3)
3
>>> accessor('foo': 9)
None 

【讨论】:

【参考方案2】:

您可以使用递归方法搜索嵌套字典表示,直到找到“key1”,然后返回 [key1][key2][key3] 查找。这假设 key1 在数据结构中没有重复。

In [9]: def lookup(key, nested_dict):
   ...:     for k, v in nested_dict.items():
   ...:         if k == key:
   ...:             return v
   ...:         if isinstance(v, dict):
   ...:             val = lookup(key, v)
   ...:             if val:
   ...:                 return val
   ...:     return None

In [10]: a = 'b' :'c':'d':1, 'f':2
In [11]: lookup('d', a)
Out[11]: 1

In [12]: lookup('b', a)
Out[12]: 'c': 'd': 1

In [13]: lookup('c', a)
Out[13]: 'd': 1

【讨论】:

以上是关于当事先不知道层次结构中的键位置时,如何访问嵌套的 Python 字典键值对?的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中展平嵌套层次结构

在 tibble 中的嵌套级别之间移动:如何引用存储在嵌套层次结构的上层中的数据

c#遍历嵌套层次很多的xml

具有深度嵌套层次结构的不可变 NSDictionary:更改键的值?

JSON 和嵌套的 NSDictionary

如何使用 ASP.NET MVC 在 Kendo UI Grid 中实现 N 级嵌套层次结构