匹配词典集.最优雅的解决方案 蟒蛇

Pol*_*Pol 6 python dictionary

给出两个词典列表,新词典和旧词典.字典表示两个列表中的相同对象.我需要找到差异并生成新的词典列表,其中只有新词典中的对象和旧词典的更新属性.
例:

   list_new=[
             { 'id':1,
               'name':'bob',
               'desc': 'cool gay'
              },

             { 'id':2,
               'name':'Bill',
               'desc': 'bad gay'
              },

              { 'id':3,
               'name':'Vasya',
               'desc': None
              },
        ]

    list_old=[
             { 'id':1,
               'name':'boby',
               'desc': 'cool gay',
                'some_data' : '12345'
              },
             { 'id':2,
               'name':'Bill',
               'desc': 'cool gay',
               'some_data' : '12345'

              },
              { 'id':3,
               'name':'vasya',
               'desc': 'the man',
               'some_data' : '12345'
              },
              { 'id':4,
               'name':'Elvis',
               'desc': 'singer',
               'some_data' : '12345'
              },
            ]
Run Code Online (Sandbox Code Playgroud)

所以..在那个例子中我想要生成新的列表,其中只有list_new的新同性恋者有更新的数据.匹配id.所以Bob将成为Boby,比尔将成为同性恋,Vasya成为 - 男人.结束猫王必须缺席.

给我一个优雅的解决方案.使用较少量的迭代循环.

有办法,我解决了这个问题.哪个不是最好的:

 def match_dict(new_list, old_list)
    ids_new=[]
    for item in new_list:
            ids_new.append(item['id'])
    result=[] 
    for item_old in old_medias:
        if item_old['id'] in ids_new:
            for item_new in new_list:
                if item_new['id']=item_old['id']
                    item_new['some_data']=item_old['some_data']
                    result.append(item_new)
    return result
Run Code Online (Sandbox Code Playgroud)

我之所以怀疑,因为循环内部存在循环.如果将有2000个项目的列表,则该过程将花费相同的时间.

kev*_*pie 1

脚步:

  • 按 id 创建 list_old 的查找字典
  • 循环遍历 list_new 字典,如果旧字典中存在,则为每个字典创建一个合并字典

代码:

def match_dict(new_list, old_list): 
    old = dict((v['id'], v) for v in old_list)
    return [dict(d, **old[d['id']]) for d in new_list if d['id'] in old]
Run Code Online (Sandbox Code Playgroud)

编辑:函数内变量命名不正确。