2013-10-11 89 views
0

我有兩個字典,dict1和dict2。 Dictionary包含鍵作爲ID和值作爲字符串。我需要執行dict1中所有值與dict2中所有其他值的所有對比較。兩個字典中的字符串值的所有對比較

我正在使用以下代碼工作正常,但速度很慢。我的實際數據在每個字典中包含大約100,000個值。有沒有其他「有效」的方式來做同樣的事情?

import difflib 
dict1 = {"111": "asdfa", "222":"gdjkgd", "333":"xvbkx"} 
dict2 = {"311": "asdfa", "322":"gdjkzxgd", "333":"xvvbkx"} 
qKeys = sorted(dict2.keys()) 
#Write the header in outfile 
nline = "ref"+ "\t" + "\t".join(qKeys) + "\n" 
print(nline) 
for item in dict1: 
    ratioArr = [] 
    refseq = dict1[item] 
    for qitem in qKeys: 
     qSeq = dict2[qitem] 
     myratio = round(difflib.SequenceMatcher(None, refseq, qSeq).ratio(),2) 
     ratioArr.append(str(myratio)) 
    #print(myratio) 
    nline = item + "\t" + "\t".join(ratioArr)+"\n" 
    print(nline) 
+0

我會考慮使用[Pandas DataFrame](http://pandas.pydata.org/pandas-docs/dev/dsintro.html#dataframe)。你可以有一個ID的索引(在你的例子中是字典鍵)。然後執行一個外部聯接操作並應用一個與結果進行比較的函數。當然,有一些方法可以通過'dict'來實現,但是您似乎確實需要一些關於ID的關係邏輯,然後應用任意一段代碼(比較操作)。這就是熊貓擅長的。 – ely

+0

謝謝@EMS,你介意給出一個關於如何做到這一點的簡單例子。 – user1140126

+0

「水母」圖書館中的一個距離度量標準(也許是jaro)可能適用。這是一個[示例答案](http://stackoverflow.com/questions/19259553/letter-combinations-between-a-string-in-a-list/19259729#19259729),打印出一定距離的單詞,但你可以輕鬆地打印出距離本身...... – beroe

回答

1

我的建議是,首先使用比difflib更快的東西,它是純粹的python。

您應該檢查您是否可以使用levenshtein distance。如果可以,可以使用pylevenshtein

最後,你有決定哪個字符串匹配的問題 - 這是一個assignment problem。它可以使用hungarian algorithm有效解決。這種算法的常用實現是munkres

+0

謝謝,pylevenshtein包比difflib'SequenceMatcher'函數的速度快了不止一個數量級。我使用了其中存在的「比率」功能。 – user1140126