Python 从列表中消除半重复项的高性能方法

Python 从列表中消除半重复项的高性能方法,python,performance,data-structures,loops,Python,Performance,Data Structures,Loops,我有一系列的难题:字母或单词之间没有空格的摩尔斯电码串。我的计划是进行字典攻击,以找到最佳的候选解决方案。我的武器是蟒蛇 我有一张17000个英语单词的单子。我还有一个小得多的单词列表,这些单词与拼图的主题相关,如果这些单词出现,它们的得分应该会更高 因此,在我的脚本的一开始,当我生成单词列表时,我使用一个元组列表的形式(单词,scoremultiplier)。以下是一小部分: [('zoned', 1.0), ('zonely', 1.0), ('zoner', 1.0), ('z

我有一系列的难题:字母或单词之间没有空格的摩尔斯电码串。我的计划是进行字典攻击,以找到最佳的候选解决方案。我的武器是蟒蛇

我有一张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个单词甚至还不是一本完整的字典。(除了完成所需的时间外,该代码还未经测试,因此可能无法运行。)它似乎也非常不符合Python,尽管我刚刚在这个项目中学习Python(并进行了一些我的第一次编程)


有更好的方法吗?我不能使用
set()
,因为重复的单词是非相等元组的一部分。我是否需要以某种方式重新构造数据?还是每次运行这个程序我都要等上一分钟?

我可能误解了这个问题,但看起来你可以从元组列表中生成一个
dict
。以后的值将自动覆盖以前的值:

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

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

这很酷,但这样他就不会保留更高的值,只保留最后一个值。我真的可以接受。在我的特殊情况下,“最后声明值”并不低于“最高声明值”。我想选择任何一种方式,但如果答案没有出现,这肯定足以满足我的情况。我认为使用字典是有意义的,即使你想要最高的值。您不能简单地将元组列表传递给dict构造函数,但一个简单的循环将起作用:
对于key,lst中的value:if value>dct.get(key,0):dict[key]=value
。使用dict可以快速访问以前的值(如果存在)。来自
集合的
defaultdict
也会起作用,不再需要使用
dict.get
。是的,我的第一个想法是
max\u scores=defaultdict(int)
/
对于word,word\u scores中的word\u scores:max\u scores[word]=max(max\u scores[word],word\u scores)
。是的,我越来越意识到使用元组是错误的。使用字典感觉不对;我最感兴趣的是键,而不是值。但是字典似乎是一件很实用的事情。如果你能使用==,你应该能够使用
集合。你所说的“重复的单词不是100%重复”是什么意思;重复的单词是非相等元组的成员。因此,如果我使用
set()
,这两个词仍然存在。很酷的问题,请与我们共享一个链接好吗?