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