我需要从给定的单词中分离所有可能的后缀(大约1000)。我正在考虑使用字典。
在这样做的过程中,我会将后缀作为键(以及有关后缀的一些其他信息,作为后续过程中所需的值)。如果最长的后缀是4个字母,我会在dict中搜索所有可能的组合。 例如: 给出一个词:'abcdefg'我会在字典中搜索'g','fg','efg'和'defg'。
我做了一些研究,并没有找到类似的dict用法。这可能是一个可行的解决方案还是我错过了什么?帮助很多。
答案 0 :(得分:3)
如果后缀不太长,你的解决方案听起来很好 - 每个单词只有少量字典查找,字典查找很快。我不认为任何更复杂的解决方案(如使用trie)在这里是值得的。对于仅删除后缀,您还可以使用集合而不是字典,但由于您需要每个后缀的附加信息,因此字典似乎是自然的选择。
答案 1 :(得分:1)
最简单(可能不是最快)的方法是在列表中查找所有匹配项。有1000个项目,你不应该遇到很多性能问题。
>>> sufx = ['foo', 'bar']
>>> [s for s in sufx if 'bazbar'.endswith(s)]
['bar']
>>>[s for s in sufx if 'bazbaz'.endswith(s)]
[]
>>> [s for s in sufx if 'bazfoo'.endswith(s)]
['foo']
答案 2 :(得分:1)
见Time Complexity of a dict。 dict的查找时间非常快(平均为O(1)!)。对于此实现,查找最长后缀的平均时间复杂度为O(k ^ 2),k为单词的长度。由于''.join
操作,它是k ^ 2(类似的O(n)操作,如反向或字符串切片,因为字符串不支持O(1)附加操作)。
简单的方法(测试python 3):
>>> from collections import deque
>>> word = "antidisestablishmentarianism"
>>> suffixes = {'ism': 3, 'anism': 6, 'ment': 4, 'arianism': 12}
>>> suffix = deque()
>>> longest = None
>>> for char in reversed(word):
... suffix.appendleft(char)
... suf = ''.join(suffix)
... if suf in suffixes:
... longest = suf
...
>>> longest
'arianism'
答案 3 :(得分:0)
我不确定我是否正确理解您的用例。我想这是关于你正在处理后缀并且很难检测的事实。
一种典型的方法(通常在索引情况下)将转换您的字符串并将后缀作为前缀处理。然后,您可以在反向后缀的排序列表中进行简单的二进制搜索(即前缀)。
答案 4 :(得分:0)
如果我理解你想做什么,你应该使用标准库中的re模块。
文档在这里:
http://docs.python.org/library/re.html#module-re
这里有一个关于副词的例子:
http://docs.python.org/library/re.html#finding-all-adverbs
至于将它们作为键存放在词典中,对我来说似乎很好。特别是,如果你想对有你关心的后缀的单词进行一些其他的处理。