加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python:合并两个任意数据结构

发布时间:2020-12-20 11:30:43 所属栏目:Python 来源:网络整理
导读:我希望有效地合并两个(相当任意的)数据结构:一个表示一组默认值,另一个表示覆盖.以下示例数据. (天真地对结构进行迭代工作,但速度非常慢.)关于处理此案例的最佳方法的想法? _DEFAULT = { 'A': 1122,'B': 1133,'C': [ 9988,{ 'E': [ { 'F': 6666,},],}_OVER
我希望有效地合并两个(相当任意的)数据结构:一个表示一组默认值,另一个表示覆盖.以下示例数据. (天真地对结构进行迭代工作,但速度非常慢.)关于处理此案例的最佳方法的想法?


_DEFAULT   = { 'A': 1122,'B': 1133,'C': [ 9988,{            'E': [ { 'F': 6666,},],}

_OVERRIDE1 = {            'B': 1234,'C': [ 9876,{ 'D': 2345,'E': [ { 'F': 6789,'G': 9876,1357,}
_ANSWER1   = { 'A': 1122,'B': 1234,}

_OVERRIDE2 = {                       'C': [ 6543,{            'E': [ {            'G': 9876,}
_ANSWER2   = { 'A': 1122,'C': [ 6543,}

_OVERRIDE3 = {            'B': 3456,'C': [ 1357,{ 'D': 4567,'E': [ { 'F': 6677,2468,}
_ANSWER3   = { 'A': 1122,'B': 3456,}

这是如何运行测试的示例:
(字典更新不起作用,只是一个存根函数.)


    import itertools

    def mergeStuff( default,override ):
        # This doesn't work
        result = dict( default )
        result.update( override )
        return result

    def main():
        for override,answer in itertools.izip( _OVERRIDES,_ANSWERS ):
           result = mergeStuff(_DEFAULT,override)
           print('ANSWER:   %s'   % (answer) )
           print('RESULT:   %sn' % (result) )

解决方法

你不能通过“迭代”来做到这一点,你需要一个像这样的递归例程:

def merge(a,b):
    if isinstance(a,dict) and isinstance(b,dict):
        d = dict(a)
        d.update({k: merge(a.get(k,None),b[k]) for k in b})
        return d

    if isinstance(a,list) and isinstance(b,list):
        return [merge(x,y) for x,y in itertools.izip_longest(a,b)]

    return a if b is None else b

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读