所以您有两个列表: 您想要检查和可能删除的单词列表和一个有效单词列表。如果您愿意,您可以将相同的列表用于这两个目的,但我假设您有两个列表。
为了提高速度,您应该将有效单词列表转换为集合。然后,您可以非常快地检查特定单词是否在该集合中。然后,取出每个单词,并检查它的所有前缀是否存在于有效单词列表中。由于“a”和“I”是英语中的有效单词,您会删除以“a”开头的所有有效单词,还是会设置一个前缀的最小长度规则?
我使用的是我的Ubuntu安装中的文件/usr/share/dict/words。该文件包含各种奇怪的东西;例如,似乎包含每个字母本身作为一个单词。因此,“k”在其中,“q”,“z”等。据我所知,这些都不是单词,但它们可能因某种技术原因而在其中。无论如何,我决定简单地从我的有效单词列表中排除任何少于三个字母的内容。
这就是我想出来的:
wfile = "/usr/dict/share/words"
valid = set(line.strip() for line in open(wfile) if len(line) >= 3)
lst = ["ark", "booze", "kite", "live", "rodeo"]
def subwords(word):
for i in range(len(word) - 1, 0, -1):
w = word[:i]
yield w
newlst = []
for word in lst:
if not any(w in valid for w in subwords(word)):
newlst.append(word)
print(newlst)
如果你喜欢使用一行代码,可以使用列表推导式来代替for循环:
newlst = [word for word in lst if not any(w in valid for w in subwords(word))]
我认为这段话比应该更加简洁,但是我喜欢能够添加打印语句进行调试。
嗯,仔细想想,如果您只是添加另一个函数,它就不会太简洁了:
def keep(word):
return not any(w in valid for w in subwords(word))
newlst = [word for word in lst if keep(word)]
如果您像这样编写函数并为它们取好名称,Python 可以很容易阅读和理解。
.startswith()
方法。这将非常慢。Python for循环不是最快的,而且在任何情况下,Python提供了一些有用的数据结构,具有快速查找功能。在这种问题中,你应该考虑“Python中哪些数据结构会有所帮助?”字典是可能的,但集合在这里是理想的。只需尝试目标单词的各种子字符串进行快速集合查找,就像我建议的那样,这将更容易和更快。 - steveha