Python 2.7 - показывать только модифицированный словарь ключ / значение при сравнении словарей - PullRequest
0 голосов
/ 01 июня 2018

Попытка сравнить два словаря с этим кодом:

def dict_compare(d1, d2):
    d1_keys = set(d1.keys())
    d2_keys = set(d2.keys())
    intersect_keys = d1_keys.intersection(d2_keys)
    added = d1_keys - d2_keys
    removed = d2_keys - d1_keys
    modified = {o: (d1[o], d2[o]) for o in intersect_keys if d1[o] != d2[o]}
    same = set(o for o in intersect_keys if d1[o] == d2[o])
    return added, removed, modified, same

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]}}

added, removed, modified, same = dict_compare(one,two)

print added
print removed
print modified
print same

Однако неверно печатает измененный ключ / значения.

Вывод:

set([])
set([])
{'1iG5NDGVre': ({'118': ['test1', 'test2', 'test3', 'tcp', '22', 'Red', '0.0.0.0/0']}, {'118': ['test1', 'test2', 'test3', 'tcp', '22', 'Red', 'Blue', '0.0.0.0/0']})}
set([])

Любойидеи, как это исправить?

Я просто хочу, чтобы он напечатал "Blue" в измененном виде.

Обновление 1:

Работает, но не когдаключи имеют разные номера ключей, т.е.

one = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "0.0.0.0/0"]}}
two = {"1iG5NDGVre": {"118": ["test1", "test2", "test3", "tcp", "22", "Red", "Blue", "0.0.0.0/0"]},"119": ["test10","test11"]}

Не будет отображать test10 и test11 как добавленные.

Dict также может иметь меньше ключей, ключ также может быть удален.Хочу также охватить этот случай.

Большое спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Вы должны сравнить список с фактическими значениями с поразрядным или (^):

differences = set(one["1iG5NDGVre"]["118"]) ^ set(two["1iG5NDGVre"]["118"])
print differences
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...