修剪对象使其看起来像python中的另一个对象的最佳方法

2024-04-24 11:20:12 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在Python中有两个对象(我将保持简单)

A = { "a" : { "b": 3, "c": 2 } }

B = { "a" : { "b": 7, "c": 4, "d": "howdy" } }

如果我想使用A作为B的模板,那么“修剪”对象B的最佳方法是什么

B = { "a" : { "b": 7, "c": 4 } }

实际上,对象要复杂得多(简单的数据类型,但有多级、列表、dict等)。你知道吗

编辑:删除了无意义的'Obj'来修复语法


Tags: 对象方法模板obj编辑列表语法dict
1条回答
网友
1楼 · 发布于 2024-04-24 11:20:12

为此可以使用递归函数:首先,检查模板的类型与原始模板的类型是否相同。如果是这样,你必须为不同的类型做不同的事情。例如,对于列表,您可以将原始列表缩减为模板列表的长度,而对于字典,则只保留模板中的键。在这两种情况下,请记住再次递归调用trim函数以获取这些列表或字典中包含的元素。你知道吗

def trim(template, original):
    if type(template) != type(original):
        raise Exception("Types don't match")
    if isinstance(template, dict):
        # iterate keys and apply trim to values from orig dictionary
        return {k: trim(v, original[k]) for k, v in template.items()}
    elif isinstance(template, list):
        # zip lists and apply trim to pairs of templ and orig elements
        return [trim(t, o) for t, o in zip(template, original)]
    else:
        # atom: just return the original value
        return original

示例(请注意,我还将"c"的值更改为列表):

>>> A = { "a" : { "b": 3, "c": [4,5] } }
>>> B = { "a" : { "b": 7, "c": [8,9,10], "d": "howdy" } }
>>> trim(A, B)
{'a': {'b': 7, 'c': [8, 9]}}

相关问题 更多 >