我想找到最有效的方法来遍历在Python中输入的字母组合,并返回一组单词,如果可行的话,其组合包括所有字母。
示例:
假设用户输入了A B C D E.目标是找到包含所有字母的最少数量的单词。在这种情况下,优先顺序为:
.... 等。
如果不匹配,则返回1.返回1.用n-1个字母等。
我有一个功能来检查“字母组合”(即单词)是否在字典中。
def is_in_lib(word):
if word in lib:
return word
return False
理想的答案不应该包括找到这些字母的组合并搜索所有这些字母。搜索我的字典是非常昂贵的,所以我需要一些可以优化我们搜索字典的时间
重要编辑:订单很重要且连续性是必需的。意思是如果用户输入“H”,“T”,“A”,则无法构建“HAT”。
实例:如果输入为:T - H - G - R - A - C - E - K - B - Y - E“输出应为”Grace“和”Bye“
答案 0 :(得分:0)
我认为这里的关键思想是让某种索引提供从规范的字符序列到实际单词的映射。这样的事情:
# List of known words
>>> words = ('bonjour', 'jour', 'bon', 'poire', 'proie')
# Build the index
>>> index = collections.defaultdict(list)
>>> for w in words:
... index[''.join(sorted(w.lower()))].append(w)
...
这将产生一种有效的方法来查找对应于一系列字符的所有字谜:
>>> index
defaultdict(<class 'list'>, {'joru': ['jour'], 'eiopr': ['poire', 'proie'], 'bjnooru': ['bonjour'], 'bno': ['bon']})
您可以通过以下方式查询索引:
>>> user_str = 'OIREP'
>>> index.get(''.join(sorted(user_str.lower())), "")
['poire', 'proie']
当然,这只会找到“确切”的字谜 - 包含所有用户提供的字母。要查找与用户提供的字符串子集匹配的所有字符串,您必须一次删除一个字母并再次检查每个组合。我觉得 recursivity 将有助于解决这个问题;)
修改强> (我应该把它放在扰流器部分吗?)
这是一个可能的解决方案:
import collections
words = ('bonjour', 'jour', 'bon', 'or', 'pire', 'poire', 'proie')
index = collections.defaultdict(list)
for w in words:
index[''.join(sorted(w.lower()))].append(w)
# Recursively search all the words containing a sequence of letters
def search(letters, result = set()):
# Assume "letters" ordered
if not letters:
return
solutions = index.get(letters)
if solutions:
for s in solutions:
result.add(s)
for i in range(0,len(letters)):
search(letters[:i]+letters[i+1:], result)
return result
# Use case:
user_str = "OIREP"
s = search(''.join(sorted(user_str.lower())))
print(s)
产:
set(['poire', 'or', 'proie', 'pire'])
不是那么糟糕,但可以改进,因为多次检查相同的字符子集。特别是用户提供的搜索字符串包含几个相同的字母。
答案 1 :(得分:0)
您可以从输入字母创建一个字符串/列表,并在单词库中的每个单词上迭代THEM:
inputstring='abcde'
for i in lib:
is_okay=True
for j in inputstring:
if i.find(j)=-1:
is_okay=False
if is_okay:
return i
我认为其他情况(两个字有3-2个字母)可以递归实现,但效率不高。