Как найти разницу между двумя списками словарей?

У меня есть два списка словарей, и я бы хотел найти разницу между ними (т.е. то, что существует в первом списке, но не второе, и то, что существует во втором списке, но не в первом списке).

Проблема в том, что это список словарей

  • Добавить число для установки
  • В Python, когда использовать словарь, список или набор?
  • Как создать набор Python только с одним элементом?
  • random.choice from set? питон
  • Устанавливает изменение порядка элементов?
  • Пустой набор букв?
  • a = [{'a': '1'}, {'c': '2'}] b = [{'a': '1'}, {'b': '2'}] set(a) - set(b) 

    результат

     TypeError: unhashable type: 'dict' 

    Желаемый результат:

     {'c': '2'} 

    Как это сделать?

  • В чем разница между наборами и списками в Python?
  • Разница во времени между методами set.discard и set.remove в Python?
  • Почему при преобразовании списка в набор и обратно я получаю нечеткий тип «list»
  • Python: как работают наборы
  • удалять элементы из набора во время итерации по нему
  • Python установлен в список
  • 3 Solutions collect form web for “Как найти разницу между двумя списками словарей?”

    Вы можете использовать оператор in чтобы узнать, находится ли он в списке

     a = [{'a': '1'}, {'c': '2'}] b = [{'a': '1'}, {'b': '2'}] >>> {'a':'1'} in a True >>> {'a':'1'} in b True >>> [i for i in a if i not in b] [{'c': '2'}] 

    Я хотел бы найти разницу между ними (то есть то, что существует в первом списке, но не второе, и то, что существует во втором списке, но не в первом списке )

    Согласно вашему определению, вы ищете симметричную разницу :

     >>> import itertools >>> a = [{'a': '1'}, {'c': '2'}] >>> b = [{'a': '1'}, {'b': '2'}] >>> intersec = [item for item in a if item in b] >>> sym_diff = [item for item in itertools.chain(a,b) if item not in intersec] >>> intersec [{'a': '1'}] >>> sym_diff [{'c': '2'}, {'b': '2'} 

    В качестве альтернативы (с использованием простой разницы, приведенной в вашем примере):

     >>> a_minus_b = [item for item in a if item not in b] >>> b_minus_a = [item for item in b if item not in a] >>> sym_diff = list(itertools.chain(a_minus_b,b_minus_a)) >>> a_minus_b [{'c': '2'}] >>> b_minus_a [{'b': '2'}] >>> sym_diff [{'c': '2'}, {'b': '2'}] 

    Вы также можете фильтровать с помощью lambda :

    Если вам нужны разные элементы в каждом списке:

     print filter(lambda x: x not in b,a) + filter(lambda x: x not in a,b) [{'c': '2'}, {'b': '2'}] 

    Или просто filter(lambda x: x not in b,a) чтобы получить элементы в a но не в b Если вы не хотите создавать полный список dicts в памяти, вы можете использовать itertools.ifilter

     from itertools import ifilter diff = ifilter(lambda x: x not in b,a) 

    Затем просто перебираем diff:

     for uniq in diff: print uniq 
    Python - лучший язык программирования в мире.