from copy import deepcopy
def merge_list_on_keys(new_list, old_list, key_list, remaining_keys=None, replace=True):
"""
对 new_list 和 old_list 根据 key_list 列表中的 key 进行合并。
如果传了 remaining_keys 则保留对应的旧 key 对应的值,仅当 replace 为 True 时起作用。
若需要保留原来的所有key,则将 replace 置为 False。
注意本函数会生成一个新的列表。
Arguments:
new_list {list} -- 新列表
old_list {list} -- 旧列表
key_list {list} -- 合并依赖的主键列表
Keyword Arguments:
remaining_keys {list} -- 当 replace 为 True 时保留对应的旧 key 对应的值 (default: {None})
replace {bool} -- 是否要用新列表的元素替换旧列表元素 (default: {True})
Returns:
list -- 生成的新的列表
"""
key_dict = {}
if new_list and old_list:
for doc in old_list:
key_id = u'@'.join([unicode(doc.get(key)) for key in key_list])
key_dict[key_id] = doc
for doc in new_list:
key_id = u'@'.join([unicode(doc.get(key)) for key in key_list])
old_doc = key_dict.get(key_id)
key_dict[key_id] = doc
if replace:
if remaining_keys and old_doc:
for key in remaining_keys:
if key not in doc and key in old_doc:
doc[key] = old_doc[key]
elif old_doc:
new_doc = deepcopy(old_doc)
new_doc.update(doc)
key_dict[key_id] = new_doc
return key_dict.values()
def replace_list_on_keys(new_list, old_list, key_list, remaining_keys):
"""
用 new_list 替换 old_list。如果传了 key_list 和 remaining_keys 则根据
key_list 中的 key 保留对应旧的 key 对应的值。
注意本函数会直接对 new_list 进行变更。
"""
key_dict = {}
if new_list and old_list:
for doc in old_list:
key_id = u'@'.join([unicode(doc.get(key)) for key in key_list])
key_dict[key_id] = doc
for doc in new_list:
key_id = u'@'.join([unicode(doc.get(key)) for key in key_list])
old_doc = key_dict.get(key_id)
if remaining_keys and old_doc:
for key in remaining_keys:
if key not in doc and key in old_doc:
doc[key] = old_doc[key]
return new_list