эффективный способ сравнить 2 словаря, которые имеют значения в качестве элементов списка, чтобы найти то, что добавлено / удалено - PullRequest
0 голосов
/ 02 апреля 2020
  • Ниже приведен текущий подход, но он работает медленно на больших наборах данных, я ищу способ сделать его более эффективным и быстрым.

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]}

1 Ответ

1 голос
/ 02 апреля 2020

Я бы отправил комментарий, если бы мог. в основном я считаю, что сортировка является трудоемкой частью. код ниже просто удаляет встречающиеся значения из перечисленных значений друг в друге. не пробовал его на большой базе данных, хотя.

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

Я хочу сказать, что вы можете сделать это без сортировки каждого списка. хорошего дня, надеюсь, вы нашли это полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...