2012-10-14 65 views
3

我有一系列難題:字母或單詞之間沒有空格的莫爾斯電碼字符串。我的計劃是做字典攻擊以找到最佳解決方案候選人。我的武器是Python。從列表中消除半重複項的高性能方式

我有17000個英文單詞的列表。我還有一個與拼圖主題相關的單詞列表,如果這些單詞出現,他們應該得分更高。

因此,在我的腳本開始時,當我生成單詞列表時,我使用了形式(單詞,scoremultiplier)的元組列表。這裏有一個小的子集:

[('zoned', 1.0), 
('zonely', 1.0), 
('zoner', 1.0), 
('zones', 1.0), 
('zoning', 1.0), 
('zoo', 1.0), 
('zoom', 1.0), 
('zoomed', 1.0), 
('zooming', 1.0), 
('zooms', 1.0), 
('zoos', 1.0), 
('ten', 1.0), 
('tens', 1.0), 
('gnash', 1.0), 
('shag', 1.0), 
('75th', 2.0), 
('seventy', 2.0), 
('fifth', 2.0)] 

在我分析了這一切,的文件,我想只是堅持高價值的話結尾,沒有的主要部分手動擺脫任何重複的文件。所以我需要寫一些東西來擺脫早期的元組,它們的第一個值等於後面的元組的值。

我可以用蠻力做到這一點:

for firstkey, (firstword, firstfactor) in enumerate(wordlist): 
    for laterkey, (laterword, laterfactor) in enumerate(wordlist[firstkey+1:]): 
     if firstword == laterword: 
      del wordlist[firstkey] 
      break 

但劇本的那部分本身就需要近45秒,我的話17000甚至沒有一個完整的解釋。 (除了完成所需的時間之外,該代碼還沒有經過測試,所以它甚至可能不起作用。)它似乎也非常不pythony,儘管我現在剛剛學習Python(並且完成了我的一些第一次編程)與這個非常項目。

有沒有更好的方法來做到這一點?我不能使用set(),因爲重複的單詞是非等元組的一部分。我需要以某種方式重組我的數據嗎?或者我應該每次運行這個時候都準備好等一整分鐘?

+0

如果你可以使用==,你應該可以使用'set'。 「重複的單詞不是100%重複」是什麼意思? –

+0

我澄清了那句話;重複的單詞是非等元組的成員。所以如果我使用'set()',這兩個單詞仍然存在。 –

+0

很酷的問題,請你能與我們分享一個鏈接? –

回答

3

我可能會誤解這個問題,但看起來你可以從元組列表中生成一個dict。後面的值會自動覆蓋較早的值:

lst = [ 
    ('foo', 1), 
    ('bar', 2), 
    ('foo', 10) 
] 

print dict(lst) # {'foo': 10, 'bar': 2} 
+0

多數民衆贊成酷,但這種方式,他不會保持較高的價值,只是最後的 – Netwave

+0

我其實可以。 「最後申報價值」並不遜於我個案中「最高申報價值」。我希望可以選擇這樣做,但如果答案沒有出現,這肯定會滿足我的情況。 –

+0

即使您想要最高價值,我認爲使用字典也很有意義。您將無法簡單地將元組列表傳遞給字典構造函數,但是一個簡單的循環將起作用:'for key,value in lst:if value> dct.get(key,0):dict [key] = value'。使用字典可以快速訪問以前的值(如果存在)。來自'collections'的'defaultdict'也可以工作,不需要使用'dict.get'。 – Blckknght