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

时间:2017-01-23 20:17:28

标签: python

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

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

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

如果我想用A作为B的模板,那么" trim"的最佳方法是什么?对象B使它看起来像:

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

在实践中,对象将更加复杂(简单的数据类型,但多级,列表,字典等)。

编辑:删除了荒谬的对象' Obj'修复语法

1 个答案:

答案 0 :(得分:0)

您可以使用递归函数:首先,检查模板的类型和原始类型是否相同。如果是这样,你必须为不同的类型做不同的事情。例如,对于列表,您可以将原始列表缩减为模板列表的长度,并且对于字典仅保留模板中的键。在这两种情况下,请记住以递归方式再次为这些列表或词典中包含的元素调用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]}} 的值更改为列表):

badge