python - 比较具有作为列表元素的值的 2 个字典以查找添加/删除的内容的有效方法
问题描述
- 以下是当前的方法,但在大型数据集上速度很慢,我正在寻找一种方法来提高效率和速度。
def DictChecker(old_dict,new_dict):
final_added = {}
final_removed = {}
for k,v in new_dict.items():
if k not in old_dict.keys():
old_dict[k] = v
final_added[k] = v
for k,v in old_dict.items():
if old_dict.keys() != new_dict.keys():
if k not in new_dict.keys():
final_removed[k] = v
for i,j in new_dict.items():
old_dict_values = old_dict.get(i)
if (j == old_dict_values):
break
else:
added = list(sorted(set(j) - set(old_dict_values)))
removed = list(sorted(set(old_dict_values) - set(j)))
final_added[i] = added
final_removed[i] = removed
return final_added,final_removed
- 尝试样本数据。
current = {"CNAME":[1,2,3,4],"MX":[2,3,1],"WOOT":[1,2,3,4]}
new = {"CNAME":[5,2,10],"MX":[1,4],"AAA":[100,200]}
added,removed = DictChecker(current,new)
print(added)
>> {'AAA': [100, 200], 'CNAME': [5, 10], 'MX': [4]}
print(removed)
>> {'WOOT': [1, 2, 3, 4], 'CNAME': [1, 3, 4], 'MX': [2, 3]}
解决方案
如果可以的话,我会发送评论。基本上我认为排序部分是耗时的部分。下面的代码只是从彼此列出的值中删除出现的值。虽然还没有在大型数据库上尝试过。
from copy import deepcopy
def dictionary_union(new, current):
newer = deepcopy(new)
for new_key, new_list_value in new.items():
if new_key in current:
for current_value in current[new_key]:
if current_value in new_list_value:
new[new_key].remove(current_value)
for added_key, added_list_value in current.items():
if added_key in newer:
for new_value in newer[added_key]:
if new_value in added_list_value:
current[added_key].remove(new_value)
return new, current
我的观点是你可以在不对每个列表进行排序的情况下做到这一点。祝你有美好的一天,希望对你有所帮助。
推荐阅读
- python - Pandas 中的 Excel SUMIF 等效项
- javascript - 我无法获得将 phpspreadsheet 文件保存到本地磁盘的文件位置弹出窗口
- java - 使用 Recycler View 在相对布局上添加 Swipe Touch 侦听器?
- swift - 如何在 XCTest 中测试 UIFontMetrics UIFont.TextStyle
- python - 计算二叉树节点
- grails - 如何在 grails 中生成默认视图?
- java - 为什么我的布局视图在使用 Android Studio 的设备上运行时非常不同
- r - 仅在“级别”由括号确定的顶层拆分带有嵌套括号的字符串
- c# - 在数组c#for循环中添加正负整数之和
- javascript - GraphQL 选择集解析