2012-06-14 67 views
0

我有一個字典列表,其中有一個屬性可能與列表中的其他字典重複或相似。我想使用相似性比較函數來唯一化這個列表。如果任何一個字典的值在某個關鍵詞「問候語」的某個百分比內相似,則只能保留一個。如何根據字典中某個值的百分比相似性來唯一區分一個字典列表

例如,在這份名單中,我想只有'你好世界的一個保留:

list = [{"greeting":"HELLO WORLD!", ...}, {"greeting":"Hello Mars", ...}, {"greeting":"Hello World!!!", ...}, {"greeting":"hello world", ...}] 

uniquifying後,結果將是:

list = [{"greeting":"HELLO WORLD!", ...}, {"greeting":"Hello Mars", ...} 

所有其他類型的字典類似應該從列表中刪除問候。 保留哪些類似的字典並不重要。

下面是Nadia Alramli功能:

def similar(seq1, seq2): 
    return difflib.SequenceMatcher(a=seq1.lower(), b=seq2.lower()).ratio() > 0.9 
+0

是否所有的字典都包含相同的密鑰? – Amr

+0

是的,但是隻有問候鍵的值是用於唯一化的值。 – Chad

+0

你想得到的結構看起來像什麼?你所有的字典都有一個單一的條目。這是典型的嗎? – robert

回答

0

使用您的函數,確定唯一性,你可以這樣做:

import difflib 

def similar(seq1, seq2): 
    return difflib.SequenceMatcher(a=seq1.lower(), b=seq2.lower()).ratio() > 0.9 

def unique(mylist, keys): 
    temp = mylist[:] 
    for d in mylist: 
     temp.pop(0) 
     [d2.pop(i) for i in keys if d.has_key(i) 
     for d2 in temp if d2.has_key(i) and similar(d[i], d2[i])] 
    return mylist 

注意,這將會改變你的字典到位:

mylist = [{"greeting":"HELLO WORLD!"}, {"greeting":"Hello Mars"}, {"greeting":"Hello World!!!"}, {"greeting":"hello world"}] 
unique(mylist, ['greeting']) 

print mylist 

輸出:

[{'greeting': 'HELLO WORLD!'}, {'greeting': 'Hello Mars'}, {}, {}] 
+0

這將工作,但字典將有其他條目不應該被檢查,只有「問候」的值應該被檢查。在這個例子中,爲了簡單起見,我在每個字典中只放入一個條目。 – Chad

+0

@查德:那麼?只比較「greeting」值。 –

+0

我編輯它來傳遞你想檢查的關鍵,你也可能想擺脫列表理解,而不是爲了清晰而用'for'循環。 – Amr

相關問題