Как вернуть значения словарного ключа, который получил новые значения в другом словаре - PullRequest
0 голосов
/ 15 ноября 2018

У меня вопрос, немного похожий на: Замена значения словаря Python значением другого словаря, которое соответствует ключу других словарей

Однако в моем случае я получил два словаря

dict1 = {'foo' : ['val1' , 'val2' , 'val3'] , 'bar' : ['val4' , 'val5']}

dict2 = {'foo' : ['val2', 'val10', 'val11'] , 'bar' : ['val1' , 'val4']}

То, что я хочу вернуть, это

dict3 = {'foo' : ['val10', 'val11'] , 'bar' : ['val1']}

, а противоположное -

dict4 = {'foo' : ['val1', 'val3'] , 'bar' : ['val5']}

, где dict3 возвращает словарь значений ключей foo'и' bar 'получили в dict2, а dict4 - это словарь значений, потерянных ключами' foo 'и' bar 'в dict2

Один из способов, который я попытался решить, это:

 iterate over both dictionaries then
    if key of dict1 == key of dict2
       return the values of the key in dict1 and compare with the values in dict2
       return the values that aren't in both 
       as a dictionary of the key and those values

Эта идея не работает и, очевидно, крайне неэффективна.Я надеялся, что есть более эффективный способ сделать это

1 Ответ

0 голосов
/ 15 ноября 2018

Два трезвых понимания сделают свое дело:

dict3 = {k: [x for x in v if x not in dict1[k]] for k, v in dict2.items()}
print(dict3)
# {'foo': ['val10', 'val11'], 'bar': ['val1']}

dict4 = {k: [x for x in v if x not in dict2[k]] for k, v in dict1.items()}
print(dict4)
# {'foo': ['val1', 'val3'], 'bar': ['val5']}

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

Вы также можете сделать это без диктовок:

dict3 = {}
for k,v in dict2.items():
    dict3[k] = [x for x in v if x not in dict1[k]]

print(dict3)
# {'foo': ['val10', 'val11'], 'bar': ['val1']}

dict4 = {}
for k,v in dict1.items():
    dict4[k] = [x for x in v if x not in dict2[k]]

print(dict4)
# {'foo': ['val1', 'val3'], 'bar': ['val5']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...