【问题标题】:Python navigating nested dictionaryPython导航嵌套字典
【发布时间】:2021-01-29 09:05:56
【问题描述】:

我有一个可能有非唯一键的嵌套字典

我需要通过字符串格式的键在此字典上动态添加/获取键值对

正在以字符串格式从键盘输入中读取作为键名的字符串

给定那个字符串,我必须找到一个与之匹配的键并使用相应的键值对做一些事情

不同嵌套级别的键可能不唯一

但它们在单个嵌套级别上是唯一的

例如,我有这个字典:

MyDict = {'a': 1, 'b': 2}

现在,我得到了一些字符串格式的输入,告诉我用键“c”再添加一个嵌套级别,然后用键值对“a:3”填充它。我就是这样做的:

last_edited_element = {'a': 3}
MyDict['c'] = last_edited_element
    
#MyDict is now {'a': 1, 'b': 2, 'c': {'a': 3}}

然后,我得到一个输入,告诉我使用具有“a”键的键值对执行某些操作

我有一条规则,首先我必须在最后编辑的关卡中查找“a”键,然后如果没有找到 - 上一层。我将上次编辑的元素存储在变量 last_edited_element 中。

最后编辑的元素是 {'a': 3},所以我这样做了:

if 'a' in last_edited_element:
     #do something with {'a': 3}
else:
     #go one level up and look for 'a' key there

所以问题是,我如何上一层楼?我将 {a: '3'} 存储在变量 last_edited_element 中,如果有任何包含 last_edited_element 的上层字典,我需要访问上层字典,例如 last_edited_element.get_parent_dictionary() 我该怎么做?

【问题讨论】:

  • 您可以将每个嵌套级别与其在父字典中的键相关联
  • 是否要求您进行自下而上的搜索?最好是自上而下然后选择你想要的键
  • 输入的内容迫使我自下而上搜索,因为我必须从上次更改的级别开始搜索

标签: python-3.x dictionary


【解决方案1】:

所以跟进我的第一条评论,你可以这样做:

  1. 初始化顶级字典
  2. 初始化所有子代以引用其父代
  3. 自下而上递归搜索,直到找到键或None
example_dict = {'a': 1, 'b': 2, 'parent': None}
example_dict['c'] = {'a': 3, 'parent': example_dict}

def find_key(k, d):
    if k in d:
        return d[k]
    elif d['parent'] is None:
        return None
    return find_key(k, d['parent'])
print(find_key('a', example_dict['c']))
> 3

print(find_key('b', example_dict['c']))
> 2

【讨论】:

  • example_dict = {'a': 1, 'b': 2, 'parent': 无} example_dict['c'] = {'a': 3, 'parent': example_dict} 这个将导致递归并创建以下字典: {'a': 1, 'b': 2, 'parent': None, 'c': {'a': 3, 'parent': {...} }}
  • @prupru 是什么意思?
  • @prupru 建议的解决方案从指定节点自下而上搜索,但必须初始化数据结构以始终提供指向父级的指针,因为无法获取字典的父级,除非您对此进行了明确编码。
  • 这两行 example_dict = {'a': 1, 'b': 2, 'parent': None} example_dict['c'] = {'a': 3, 'parent': example_dict},他们确实创建了一个字典 {'a': 1, 'b': 2, 'parent': None, 'c': {'a': 3, 'parent': {...}}} what那些点“……”是什么意思?更多嵌套字典?
  • 是的。虽然我没有看到问题。
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2018-05-31
  • 1970-01-01
  • 2021-05-10
相关资源
最近更新 更多