Python 求问多层嵌套字典怎么改值,套娃字典真是大坑

2020-10-15 17:43:12 +08:00
 L00kback

事情是这样的,有一个字典嵌套列表,列表嵌套字典,然后字典又嵌套了列表。列表里面的元素结构都是一样的:

example={'a': 
        	{'b': 
            	[{'c': [{'d': 11}, {'d': 12}]},
             	 {'c': [{'d': 21}, {'d': 22}, {'d': 23}]},
                 {'c': [{'d': 21}, {'d': 22}, {'d': 23}]}
            	]
        	}
     	}

需要更新 d 的值(比如都+1),有没有办法给出一个路由input=[a,b,c,d]直接定位到 d 然后改它的值?目前只想到这种方法比较方便,有别的方法请指导!

直接绝对路径去改量贼大很麻烦,有些 key 都不止套一层。数据发过来是这样的没有办法改。

提前感谢各位大佬了

2701 次点击
所在节点    问与答
6 条回复
Yourshell
2020-10-15 17:57:08 +08:00
遍历
black11black
2020-10-16 06:55:10 +08:00
简单想了一下应该是除了笨方法以外没什么好办法,只要你现在还在用这种数据结构的话。根据需求可以改结构,比如改成写入友好的,增加读取开销
L00kback
2020-10-16 09:23:22 +08:00
@black11black 非常感谢,确实是这种存储方式不利于更改,只能想办法换数据结构了
Magic347
2020-10-16 18:48:02 +08:00
可以把字典这种数据结构看成是一棵树,字典里的每个(key, val) pair 就是这棵树上的一个节点,
这个问题的复杂之处在于这里的 val 值类型可能是基础数据类型(比如数值、字符串或布尔),也可能是字典类型或者列表类型,如果一旦是字典类型或者列表类型,那么我们还需要进一步去查看这个 val 内部是否有我们需要寻找的 key 。

所以其实这个问题就转化为,想办法扫描一遍这棵树所有的节点找到指定的 key,然后更新对应的 val 即可,其实也就归结为一个树的遍历问题,这里使用实现上更方便的 dfs 方式(深度优先遍历,可以递归实现),代码如下,希望对你有所启发:

def _update(val):
   return val + 1 #TODO

def modify(dic):
   for key, val in dic.items():
      if key == "d" and type(val) == type(1):
         dic[key] = _update(val)
      elif type(val) == type({}):
         modify(val) # recursively call function
      elif type(val) == type([]):
         if len(val) > 0:
            for _dic in val:
               modify(_dic) # recursively call function
L00kback
2020-10-19 15:03:53 +08:00
@Magic347
感谢老哥!!!太感动了
建了一个 BTree,成功了!谢谢🙏
现在是用一个数组存节点,节点保存值、下一跳、下一跳的 key 值(字典用字典的 key,数组用位置标号)
搜索和更新还是遍历所有节点的方式做的,递归有时间再看了哈哈
Magic347
2020-10-19 15:58:32 +08:00
@L00kback 赞~不客气,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715330

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX