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

标签 python oop dictionary recursion nested

我已经看到了这个问题的答案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_colorcolor 值!

理想地寻找一个优雅的 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 调用它来处理部分字符串。

关于python - 递归搜索嵌套字典并将函数应用于搜索键 :value pair,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49897107/

相关文章:

python - 压缩几个字典或 OrderedDict 保持顺序并给出默认值(如 zip_longest)

python - 从字符串创建字典

c++ - 删除 C++ 映射中的指针

python - SleekXMPP 随意发送消息并仍然监听传入的消息。

python - 应用引擎 : map form data to url

c#:继承/接口(interface)静态成员?

php自动setter和getter

java - Java 中的继承与静态

python - 当我在 sympy 中使用solve()时,变量列表为空?

c# - 为什么我不能使用 TCP 客户端发送两个消息? (续)