Слияние словарей с удалением дубликатов в значениях
Бьюсь над проблемой слияния словарей по ключу с удалением дубликатов в значениях. Саму задачу вроде решил, но волнуют вопросы производительности и использования памяти в первую очередь. Словари представлены в следующем виде:
a = {'1': [2,3,4], '5': [6,7], '8': [9,10], '10': [555]}
b = {'1': [7], '5': [8], '8': [9,10], '9': [0]}
Из них надо получить результирующий словарь:
{'1': [2, 3, 4, 7], '5': [8, 6, 7], '8': [9, 10], '10': [555], '9': [0]}
Порядок элементов в значениях результирующего словаря (это всегда списки) не имеет значения. В первую очередь нужно ориентироваться на то, что оба исходных словаря имеют большие размеры. Мое решение:
a = {'1': [2,3,4], '5': [6,7], '8': [9,10], '10': [555]}
b = {'1': [7], '5': [8], '8': [9,10], '9': [0]}
for k, v in b.items():
if k in a.keys():
a[k].extend(v)
else:
a[k] = v
for _, v in a.items():
[_] = list(set(v))
Есть ли возможность как-то улучшить скорость работы и уменьшить затраты памяти? Также не уверен, что во всех случаях этот алгоритм вообще будет работать правильно. По итогу, решил не создавать третью переменную, потому что тогда, получается, будет требоваться больше памяти на хранение словарей (к примеру, первый словарь - 100 значений, второй - 100 значений, и генерирующийся третий - больше 100 и меньше 200 значений).
Ответы (1 шт):
ну можно не вызывать a.keys() в проверке вхождения, так как и так будет проверка вхождения ключа. можно также взять DefaultDict и убрать условие в первом цикле вообще. ну и туда же перекинуть set()
ну вот наверное как-то так
from collections import defaultdict
a = {'1': [2,3,4], '5': [6,7], '8': [9,10], '10': [555]}
b = {'1': [7], '5': [8], '8': [9,10], '9': [0]}
r = defaultdict(list, **a)
for k, v in b.items():
_b = r[k]
_b.extend(v)
r[k] = list(set(_b))
print(dict(r))