Skip to main content
 首页 » 编程设计

python之递归搜索嵌套字典并将函数应用于搜索键 :value pair

2025年05月04日21sky-heaven

我已经看到了这个问题的答案Finding a key recursively in a dictionary .但是,它没有给我想要的结果。问题是一旦找到给定的 key ,它就会停止查找。这意味着如果字典中有其他键的实例,那么这些实例将被忽略。

假设我的字典如下所示:

nested_dico = { 
     'columns': { 
                'background_color': 'A5300F', 
                'font': {'bold': True, 'color': 'FFFFFF', 'size': 15}}, 
     'index': { 
                'background_color': 'E1CDCC'}, 
     'master': { 
                'align': 'center', 
                'background_color': 'FFFFFF', 
                'font': {'color': '000000', 'name': 'arial', 'size': 16}, 
                'vertical_anchor': 'middle'}} 

期望的行为是函数能够将给定的转换应用到字典中与键匹配的所有元素。

例如,当运行 converter(nested_dico, 'size', lambda x: x*2) 我希望 converter 返回包含所有大小值的同一个字典乘以 2。我需要这个的实际实现是将所有颜色值从十六进制转换为 RGB 代码。

Bonus 如果您可以让它对部分字符串起作用,则加分。例如:converter(nested_dico, 'color', RGB()) 将更改 background_color 和 color 值!

理想地寻找一个优雅的 pythonic 解决方案。

请您参考如下方法:

是否要将转换函数应用于与字典中的模式匹配的任何嵌套键?

d = {"color": 1, 'child': {"color": 2}} 
 
def transform(d, p, t): 
    for each in d: 
        if isinstance(d[each], dict): 
            transform(d[each], p, t) 
        if each == p:  
            d[each] = t(d[each]) 
 
transform(d, "color", lambda x: x+1) 

如果您想概括“您如何确定模式是否匹配”,那么您可以像这样将逻辑作为函数传递:

d = {"color": 1, 'child': {"background-color": 2}} 
 
def transform(d, p, t): 
    for each in d: 
        if type(d[each]) == dict: 
            transform(d[each], p, t) 
        if p(each):  
            d[each] = t(d[each]) 
 
transform(d, lambda x: 'color' in x, lambda x: x+1) 

参数 p 被称为 predicate 函数。例如,您可以使用 'color' in x 调用它来处理部分字符串。