2009-11-12 51 views
1

我的字典删除重复词典在列表中的蟒蛇

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

的两份名单我想删除列表1中这是在list2中的字典。我有一个类似的问题,我必须列出,而不是一本字典的列表,它是在这里解决

python function slowing down for no apparent reason

如果我使用相同的代码是,

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'} 

哪些是相同的实际上被认为是不同的。如何更改代码或我能做些什么来删除list1中出现在list2中的字典?

+1

每个字典都有相同的键和相同的相关值。它在打印时的按键顺序与我给出的两个示例中的顺序不同。 – randomThought 2009-11-12 19:18:33

回答

5

您不能在set s中使用dict s,因为它们是可变的并且没有稳定的身份。你可以通过制作一个tuple来解决这个问题。请注意,简单地将dict包装在tuple中并没有解决这样的事实,即不同的dicts仍将显示为不同的对象,即使它们包含相同的项目。

要将两个“等效”dict s变成相同的对象,请取出所有项目,对项目进行排序,然后将它们填入tupletuple(sorted(map.items()))。如果这些tuples包含相同的物品,则它们将适当地进行相等的比较,而不管原始的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 
+0

只要记住,这个版本将适用于词典清单,而不是列表清单:) – gnud 2009-11-12 19:18:24

+0

@gnud感谢您回答我发布的最后一个问题。像魅力一样工作。 – randomThought 2009-11-12 19:25:48