【问题标题】:Recursively search and modify complex object (dict of ists of dicts)递归搜索和修改复杂对象(字典列表的字典)
【发布时间】:2019-07-30 21:50:38
【问题描述】:

我有一个复杂的对象。

目前它是字典列表的字典。但将来可能会发生变化,但仍只使用列表和字典。

我想查找类型为“datetime”的所有列表元素字典值并将它们更改为字符串。

递归搜索似乎正在工作,但无法弄清楚如何将修改后的值写回相应的(dict val 或列表项)。

def mod_complex(c_obj):
    if isinstance(c_obj, datetime.datetime):
        print(c_obj)
        c_obj = str(c_obj) ???
    elif isinstance(c_obj, list):
        for v in c_obj:
            mod_complex(v)
    elif isinstance(c_obj, dict):
        for k, v in c_obj.items():
            mod_complex(v)

【问题讨论】:

  • 一种方法是从每次调用中返回它,另一种方法是在 for 循环中对字符串进行转换/分配,而不是再次递归到 self 中并使用要转换的值

标签: python python-3.x


【解决方案1】:
def mod_complex(c_obj):
    if isinstance(c_obj, datetime.datetime):
        print(c_obj)
        return str(c_obj)
    elif isinstance(c_obj, list):
        for i, v in enumerate(c_obj):
            c_obj[i] = mod_complex(v)
    elif isinstance(c_obj, dict):
        for k, v in c_obj.items():
            c_obj[k] = mod_complex(v)

    return c_obj

【讨论】:

  • 祝你好运,在迭代字典时修改它。
  • @panda-34 只要不改变大小就可以了。这只会覆盖现有的密钥。
【解决方案2】:

您有一种简单的方法,即返回一个新对象,每个子对象也是一个新对象,等等。

看起来像这样:

def mod_complex(c_obj):
    if isinstance(c_obj, int):
        return c_obj*2
    elif isinstance(c_obj, list):
        return [mod_complex(v) for v in c_obj]
    elif isinstance(c_obj, dict):
        return {f"new {k}": mod_complex(v) for k, v in c_obj.items()}

ob = { 
  "1st list": [
    { "A": 1, "B": 2 },
    { "C": 3, "D": 4 },
  ],
  "2nd list": [
    { "E": 5, "F": 6 },
    { "G": 7, "H": 8 },
  ]
}

print(mod_complex(ob))

哪些打印:

{
    "new 1st list": [
        { "new A": 2, "new B": 4 },
        { "new C": 6, "new D": 8 }
    ],
    "new 2nd list": [
        { "new E": 10, "new F": 12 },
        { "new G": 14, "new H": 16 }
    ]
}

这样做的好处是你确定不会发生任何变异,因此print(ob) 输出:

{ 
  "1st list": [
    { "A": 1, "B": 2 },
    { "C": 3, "D": 4 },
  ],
  "2nd list": [
    { "E": 5, "F": 6 },
    { "G": 7, "H": 8 },
  ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2014-01-12
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多