gpt4 book ai didi

Python-删除列表中包含其他单词的所有单词

转载 作者:太空宇宙 更新时间:2023-11-03 12:22:24 25 4
gpt4 key购买 nike

我有一个列表,其中包含字典中的单词。我想找到一种方法来删除所有单词,只考虑在目标单词的 beginning 处形成的词根。

例如,单词“rodeo”将从列表中删除,因为它包含有效的英语单词“rode”。 “Typewriter”将被删除,因为它包含有效的英语单词“type”。但是,即使包含单词“nick”,“snicker”一词仍然有效,因为“nick”位于单词的中间而不是单词的开头。

我是这样想的:

 for line in wordlist:
if line.find(...) --

但我希望“if”语句遍历列表中的每个单词,检查是否找到它,如果找到,则将其从列表中删除,以便仅保留词根。我是否必须创建一个 wordlist 的副本才能遍历?

最佳答案

因此您有两个列表:您要检查并可能删除的单词列表,以及有效单词列表。如果愿意,您可以将同一个列表用于两个目的,但我假设您有两个列表。

为了提高速度,您应该将有效单词列表变成一个集合。然后您可以非常快速地检查该组中是否有任何特定单词。然后,取每个词,并检查其所有前缀是否都存在于有效词列表中。由于“a”和“I”是英语中的有效词,您是否会删除所有以“a”开头的有效词,或者您是否有一个规则来设置前缀的最小长度?

我正在使用我的 Ubuntu 安装中的文件/usr/share/dict/words。这个文件里面有各种奇怪的东西;例如,它似乎包含每个字母本身作为一个词。因此,“k”、“q”、“z”等都在其中。据我所知,这些都不是单词,但出于某种技术原因,它们可能在那里。不管怎样,我决定简单地从我的有效单词列表中排除任何短于三个字母的内容。

这是我想出的:

# build valid list from /usr/dict/share/words
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:
# uncomment these for debugging to make sure it works
# print "subwords", [w for w in subwords(word)]
# print "valid subwords", [w for w in subwords(word) if w in valid]
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 可以很容易阅读和理解。

关于Python-删除列表中包含其他单词的所有单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4766157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com