Удаление дубликатов словарей в списке в Python - PullRequest
1 голос
/ 12 ноября 2009

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

list1 = [ {..}, {..}, ..]
list2 = [ {..}, {..}, ..]

Я хочу удалить словари из списка1, которые есть в списке2. У меня была похожая проблема, когда вместо словаря у меня был список списков, и он решается здесь

Функция Python замедляется без видимой причины

Если я использую тот же код, который

def removeDups(list1, list2):
    list2_set = set([tuple(x) for x in list2])
    diff = [x for x in list1 if tuple(x) not in list2_set]

    return diff

Я не получаю правильных результатов, так как словари типа

{key1:'a', key2:'b'} and 
{key2:'b', key1:'a'}

которые одинаковы, на самом деле считаются разными. Как я могу изменить код или как удалить словари из списка1, которые появляются в списке2?

1 Ответ

5 голосов
/ 12 ноября 2009

Вы не можете использовать dict s в set s, потому что они изменчивы и не имеют стабильных идентификаторов. Вы можете обойти это, сделав tuple из их предметов. Обратите внимание, что простое завершение dict в tuple не позволяет избежать факта, что отдельные dict все равно будут казаться различными объектами, даже если они содержат одинаковые элементы.

Чтобы превратить два "эквивалентных" dict в равные объекты, возьмите все их предметы, отсортируйте предметы, а затем сложите их в tuple: tuple(sorted(map.items())). Эти tuple будут правильно сравниваться друг с другом, если они содержат одинаковые элементы, независимо от порядка оригинала dict.

def removeDups(list1, list2):
    set1 = set(tuple(sorted(x.items())) for x in list1)
    set2 = set(tuple(sorted(x.items())) for x in list2)

    return set1 - set2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...