给出两个词典列表,新词典和旧词典.字典表示两个列表中的相同对象.我需要找到差异并生成新的词典列表,其中只有新词典中的对象和旧词典的更新属性.
例:
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个项目的列表,则该过程将花费相同的时间.
脚步:
代码:
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)
编辑:函数内变量命名不正确。