Какой наилучший способ создать словарь из разницы двух других словарей?

#python #python-2.7 #dictionary #difference

#python #python-2.7 #словарь #разница

Вопрос:

У меня есть два словаря списков:

 dic1 = {'a' : [3, 4, 5], 'b' : [0, 1, 2]}
dic2 = {'a' : [3, 4, 5], 'b' : [8, 1, 2, 30], 'c' : [9, 8, 2]}
  

и хотите третий, в котором есть только то, что есть во втором словаре, а не в первом:

 dic3 = {'b' : [8, 30], 'c' : [9, 8, 2]}
  

какой наиболее понятный способ сделать это в python 2.7 и ниже?

Ответ №1:

Вы можете использовать понимание dict для перебора элементов dic2 , чтобы построить новое сопоставление разнице между списками dic2 и dic1 одних и тех же ключей, используя set difference, отфильтровывая ключи с одинаковыми значениями списка в обоих dicts:

 {k: list(set(l).difference(dic1.get(k, []))) for k, l in dic2.items() if dic1.get(k) != l}
  

Это возвращает:

 {'b': [8, 30], 'c': [8, 9, 2]}
  

Ответ №2:

(Без понимания dict)

Вы могли бы использовать difference available на set объектах:

 dic1 = {'a' : [3, 4, 5], 'b' : [0, 1, 2]}
dic2 = {'a' : [3, 4, 5], 'b' : [8, 1, 2, 30], 'c' : [9, 8, 2]}

for k, v in dic2.items():
    if k in dic1.keys():
        new_v = list(set(v).difference(dic1[k]))
        if len(new_v) > 0: dic3[k] = new_v
    else:
        dic3[k] = v
  

Это обеспечит желаемый результат.

Комментарии:

1. Это близко к тому, что я печатал, когда решил спросить.

Ответ №3:

Если какой-либо ключ dic2 отсутствует в dic1 или значение, соответствующее какому-либо ключу, отличается в обоих словарях, затем добавьте эту пару ключ-значение в другой словарь.

  for k in dic2.keys():
   if (k not in dic1.keys()) or (dic1[k] != dic2[k]):
     dic3[k] = dic2[k]