我目前有一个名为“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)
