如果您想要合并副本,而不改变原始字典并监视名称冲突,您可以尝试这个解决方案:
如果您想要一个不改变原始字典且检测到名称冲突的合并副本,您可以尝试以下解决方案:
import copy
import itertools
def main():
dict_a = dict(a=[1], b=[2])
dict_b = dict(b=[3], c=[4])
complete_merge = merge_dicts(dict_a, dict_b, True)
print(complete_merge)
resolved_merge = merge_dicts(dict_a, dict_b, False)
print(resolved_merge)
def merge_dicts(a, b, complete):
new_dict = copy.deepcopy(a)
if complete:
for key, value in b.items():
new_dict.setdefault(key, []).extend(value)
else:
for key, value in b.items():
if key in new_dict:
counter = itertools.count(1)
while True:
new_key = f'{key}_{next(counter)}'
if new_key not in new_dict:
new_dict[new_key] = new_dict.pop(key)
break
while True:
new_key = f'{key}_{next(counter)}'
if new_key not in new_dict:
new_dict[new_key] = value
break
else:
new_dict[key] = value
return new_dict
if __name__ == '__main__':
main()
程序会显示合并后的两个字典的以下表示:
{'a': [1], 'b': [2, 3], 'c': [4]}
{'a': [1], 'b_1': [2], 'b_2': [3], 'c': [4]}
dict2[key].extend(dict1[key])
- John Kugelman