【发布时间】:2018-12-07 16:44:40
【问题描述】:
我想实现以下目标。它本质上是任意数量的字典的组合或合并,参考“种子”或根字典,在最终结果中累积所有未更改和更新的值。
seed = {
'update': False,
'data': {
'subdata': {
'field1': 5,
'field2': '2018-01-30 00:00:00'
},
'field3': 2,
'field4': None
},
'data_updates': {},
'subdata_updates': {},
'diffs': {}
}
update_1 = {
'update': True,
'data': {
'subdata': {
'field1': 6,
'field2': '2018-01-30 00:00:00'
},
'field3': 2,
'field4': None
},
'data_updates': {},
'subdata_updates': {'field1': 6},
'diffs': {
'field1': {
'field': 'field1',
'before': 5,
'after': 6
}
}
}
update_2 = {
'update': True,
'data': {
'subdata': {
'field1': 5,
'field2': '2018-01-30 00:00:00',
},
'field3': 2,
'field4': 1
},
'data_updates': {'field4': 1},
'subdata_updates': {},
'diffs': {
'field4': {
'field': 'field4',
'before': None,
'after': 1
}
}
}
# I want to be able to pass in an arbitrary number of updates.
assert reduce_maps(seed, *[update_1, update_2]) == {
'update': True,
'data': {
'subdata': {
'field1': 6,
'field2': '2018-01-30 00:00:00',
},
'field3': 2,
'field4': 1
},
'data_updates': {'field4': 1},
'subdata_updates': {'field1': 6},
'diffs': {
'field1': {
'field': 'field1',
'before': 5,
'after': 6
},
'field4': {
'field': 'field4',
'before': None,
'after': 1
}
}
}
您可以假设数据将始终处于这种形状,您也可以假设每个有效负载只更新一个字段,并且没有两次更新会更新同一个字段。
我可以隐约感知到fold 的类似物潜伏在后台,这里在seed 周围建立数据。
【问题讨论】:
-
对于这种复杂的问题,编写自己的解决方案是完全可以的。正如下面的答案所示,您可以将问题分解为更小的部分并为每个部分编写一个函数。一旦你有了这些工作函数,你就可以将它们重构为更“优雅”的结构,比如用列表推导替换循环。
-
是的,我知道,谢谢。我主要想看看我可能错过了哪些想法。
-
您可能对我们的姐妹网站Code Review 感兴趣。在您编写了一个可行的解决方案后,社区非常乐意指出您可以改进代码的方法。这种评论似乎更符合您在这里要问的内容。
标签: python dictionary reduce fold