Пересечение и различие двух словарей

Учитывая два словаря, я хочу посмотреть их пересечение и разницу и выполнить функцию f на элементах, которые пересекаются и выполняют g по уникальным элементам. Вот как я узнал, что представляют собой уникальные и пересекающиеся элементы, где d1 и d2 – два словаря, Как распечатать d_intersection и d_difference как словари внутри кортежа? Результат должен выглядеть примерно так ({пересекающиеся ключи, значения}, {разностные ключи, значения}), например: данный

d1 = {1:30, 2:20, 3:30, 5:80} d2 = {1:40, 2:50, 3:60, 4:70, 6:90} 

Выход должен быть ({1: 70, 2: 70, 3: 90}, {4: 70, 5: 80, 6: 90})

 dic = {} d_intersect = set(d1) & set(d2) d_difference = set(d1) ^ set(d2) for i in d_intersect: dic.update({i : f(d1[i],d2[i])}) for j in d_difference: dic.update({j : g(d1[j],d2[j])}) 

Может ли кто-нибудь сказать мне, где я ошибся, и почему мой код дает ключевую ошибку 4?

  • Почему python упорядочивает мой словарь так?
  • как заказать словарь python (сортировка)
  • Как перенести два словаря в один цикл?
  • В Python, как я перебираю словарь в отсортированном порядке?
  • Есть ли реализация «multimap» в Python?
  • Parsing Suds SOAP-тип данных в Python dict
  • Объединение 3 dict () в python
  • Лучший способ удалить элемент из словаря Python?
  • 2 Solutions collect form web for “Пересечение и различие двух словарей”

    Вот один из способов сделать это, хотя может быть более эффективный метод.

     d1 = {1:30, 2:20, 3:30, 5:80} d2 = {1:40, 2:50, 3:60, 4:70, 6:90} d_intersect = {} # Keys that appear in both dictionaries. d_difference = {} # Unique keys that appear in only one dictionary. # Get all keys from both dictionaries. # Convert it into a set so that we don't loop through duplicate keys. all_keys = set(d1.keys() + d2.keys()) # Python2.7 #all_keys = set(list(d1.keys()) + list(d2.keys())) # Python3.3 for key in all_keys: if key in d1 and key in d2: # If the key appears in both dictionaries, add both values # together and place it in intersect. d_intersect[key] = d1[key] + d2[key] else: # Otherwise find out the dictionary it comes from and place # it in difference. if key in d1: d_difference[key] = d1[key] else: d_difference[key] = d2[key] 

    Вывод:

    {1: 70, 2: 70, 3: 90}

    {4: 70, 5: 80, 6: 90}

    Вы получаете KeyError для 4, поскольку ^ ищет симметричную разницу, что означает, что ключи уникальны для обоих , ключи не в обоих. Вам также не нужно создавать наборы, вы можете использовать объект вида, возвращенный из вызова .keys

     d1 = {1: 30, 2: 20, 3: 30, 5: 80} d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90} # d1.keys() ^ d2 -> {4, 5, 6}, 4, 6 unique to d2, 5 unique to d1. symm = {k: d1.get(k, d2.get(k)) for k in d1.keys() ^ d2} inter = {k: d2[k] + d1[k] for k in d1.keys() & d2} 

    d1.get(k, d2.get(k)) работает для симметричной разности, поскольку он ловит, когда мы получаем уникальный ключ из d2 .

    Код для python2 немного отличается, вам нужно будет заменить .keys на .viewkeys чтобы получить объект вида :

      {k: d1.get(k, d2.get(k)) for k in d1.viewkeys() ^ d2} {k: d2[k] + d1[k] for k in d1.viewkeys() & d2} 

    Чтобы получить просто разницу между двумя наборами, т.е. то, что находится в a, но не в b, вам нужно - :

     In [1]: d1 = {1: 30, 2: 20, 3: 30, 5: 80} In [2]: d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90} In [3]: {k: d2[k] for k in d2.keys() - d1} Out[3]: {4: 70, 6: 90} In [4]: {k: d1[k] for k in d1.keys() - d2} Out[4]: {5: 80} In [5]: d2.keys() - d1 # in d2 not in d1 Out[5]: {4, 6} In [6]: d1.keys() - d2 # in d1 not in d2 Out[6]: {5} In [7]: d1.keys() ^ d2 # unique to either Out[7]: {4, 5, 6} 

    Симметричная разница подобна объединению различий:

     In [12]: d1.keys() - d2 | d2.keys() - d1 Out[12]: {4, 5, 6} 

    Все операторы обсуждаются в документах python, а также страница вики на Set_ (математика) дает вам хороший обзор.

    Python - лучший язык программирования в мире.