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

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

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

a = [{'a': '1'}, {'c': '2'}] b = [{'a': '1'}, {'b': '2'}] set(a) - set(b) 

результат

 TypeError: unhashable type: 'dict' 

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

 {'c': '2'} 

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

    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 - лучший язык программирования в мире.