Skip to main content
 首页 » 编程设计

python之检查字典中是否存在字典,如果存在则更改它

2025年05月04日7think

我目前有一个名为“modules_dict”的有序字典。在“modules_dict”中有类“module_class”的对象,这些对象中的每一个都可以有“submods”的实例,它们也是类“module_class”,等等。

我的问题是:如果存在名称为“digital”的类“module_class”,我如何检查每个“module_class”及其任何“子模组”,如果存在则替换它?

class module_class: 
self.name 
self.submods = OrderedDict() 

示例:

modules_dict = { 
"angel": module_class(submods = {  
    "analog": module_class(submods = {  
        "digital": module_class()}) 
    }) 
} 

非理想方案(下面的“self”代表module_class“digital”):

for mod in modules_dict.values(): 
    for submod in mod.submods.values(): 
        for sub in submod: 
            if self.name == sub.name: 
                modules_dict[mod.name].submods[sub.name] = [self] 
 
            for sm in sub.submods.values(): 
                for s in sm: 
                    if self.name == s.name: 
                        modules_dict[mod.name].submods[sub.name].submods[s.name] = [self] 

显然不知道需要多少 for 循环。我正在考虑使用递归,但我不知道如何更改字典“modules_dict”

请您参考如下方法:

递归绝对是要走的路,尤其是当你不确定你可以处理多少嵌套的字典时。

我尝试了其他答案,但无法正常工作。我刚刚成功测试了这个:

def find_and_replace(d, key, replacement="replacement"): 
    for k,v in d.items(): 
        if isinstance(v, dict): 
            print "found nested dict" 
            if find_and_replace(v, key): 
                return True 
 
        elif isinstance(v, str): 
            if k==key: 
                d.update({k:replacement}) 
                print "replaced [%s] with [%s]" % (v, replacement) 
                return True 

这是我的输出:

>>> etc = {'this': {'that': {'theother': 'a'}}} 
>>> find_and_replace(etc, "theother") 
found nested dict 
found nested dict 
replaced [a] with [replacement] 
>>> print etc 
{'this': {'that': {'theother': 'replacement'}}} 

elif isinstance(v, str): 条件是一个占位符,供您执行对 module 实例的检查。我在这里检查字符串,但你明白了。


编辑: 问题陈述中的类可以这样实现吗?

import collections 
class module_class(object): 
    def __init__(self, submods={}): 
        self.name = "name" 
        self.submods = collections.OrderedDict(submods)