2009-11-12 50 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