2017-02-17 2 views
1

У меня есть два словаря. Один выглядит следующим образом:Сравните два словаря, удалите пару ключ/значение в одном dict, если он существует в другом

dict1 = {'ana': 'http://ted.com', 'louise': 'http://reddit.com', 'sarah':'http://time.com'} 

Другой выглядит следующим образом:

dict2 = {'patricia': 'http://yahoo.com', 'ana': 'http://ted.com', 
     'louise': 'http://reddit.com', 'florence': 'http://white.com'} 

Мне нужно сравнить два словаря, и исключить из dict2 любой ключ/значение пары уже присутствует в dict1

Как вы можете видеть, Ана и Луиза уже существуют в dict1, поэтому я хотел бы автоматически удалить его с dict2 Выход ожидается будет содержать только элементы уникальны для dict2и уже нет в dict1, и будет выглядеть следующим образом:

dict2 = {'patricia': 'http://yahoo.com', 'florence': 'http://white.com'} 

мне не нужно делать ничего о Sarah быть в dict1. Мне только интересно сравнить dict2 с dict1, чтобы удалить дубликаты.

Дополнительно:

Я попытался петлю над dicts по-разному, но он дал мне два типа ошибок: not hashable type или dict content changed during action.

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

+0

Вам небезразлично, что и значение ключа И равно, или только уход за ключом? – wim

ответ

1

Jim's answer удаляет элементы, если ключи совпадают. Я думаю, вы хотели бы удалить, если оба ключа и совпадают. Это на самом деле очень легко, так как вы используете Python 3:

>>> dict(dict2.items() - dict1.items()) 
{'florence': 'http://white.com', 'patricia': 'http://yahoo.com'} 

Это работает, потому что dict_items объекты лечения операции вычитания, как набор различий.

+0

Такая простота и элегантность. Вау. СПАСИБО ОЧЕНЬ МНОГО, ВСЕ – skeitel

0

Тогда просто использовать словарь понимание:

dict2 = {i:j for i,j in dict2.items() if i not in dict1} 

, что приводит к dict2 существа:

{'florence': 'http://white.com', 'patricia': 'http://yahoo.com'} 

на месте решение может быть:

for k in dict1: 
    dict2.pop(k, None) 

что дает аналогичный результат.

0

Это просто ищет все ключи в dict1, которые находятся в dict2, а затем удаляет пары ключ/значение из dict2.

for key in dict1: 
    if key in dict2 and (dict1[key] == dict2[key]): 
     del dict2[key] 

Hoe это помогает!

Смежные вопросы