python中 list of dict 的更新替換
阿新 • • 發佈:2022-01-26
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