Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在顺序不同的情况下检查字符串中的单词-PYTHON_Python_String_Dictionary_Set_Anagram - Fatal编程技术网

如何在顺序不同的情况下检查字符串中的单词-PYTHON

如何在顺序不同的情况下检查字符串中的单词-PYTHON,python,string,dictionary,set,anagram,Python,String,Dictionary,Set,Anagram,我试图找到尽可能多的单词,例如“工作簿” 所以结果应该是:工作,工作簿,书,书本,鞠躬,行等 这是我尝试过的一种方法,但找不到按不同顺序拼写的单词。(例如,即使您可以将“工作簿”中的字母重新排列为“bow”,它也不会附加“bow”) 我试图解决这个问题的另一种方法是使用集合。。但这也不能完全起作用,因为它附加了一些单词,例如,有超过1个“w”的单词,比如“wow”或“wowwow”,尽管我希望它只使用“工作簿”中的字母数和字母数 f = open('/usr/share/dict/words',

我试图找到尽可能多的单词,例如“工作簿” 所以结果应该是:工作,工作簿,书,书本,鞠躬,行等

这是我尝试过的一种方法,但找不到按不同顺序拼写的单词。(例如,即使您可以将“工作簿”中的字母重新排列为“bow”,它也不会附加“bow”)

我试图解决这个问题的另一种方法是使用集合。。但这也不能完全起作用,因为它附加了一些单词,例如,有超过1个“w”的单词,比如“wow”或“wowwow”,尽管我希望它只使用“工作簿”中的字母数和字母数

f = open('/usr/share/dict/words', 'r')
test = "workbook"
anagramlist = []

for word in f:
    if len(word) > 2 and set(word[:-1]) == set(test) & set(word[:-1]): 
        anagramlist.append(word[:-1])

print anagramlist
这个的输出是。我希望我能在这种情况下修复一些东西,或者这是一种完全错误的方法

['bo', 'bob', 'bobo', 'boo', 'boob', 'boobook', 'book', 'bookwork', 'boor', 'bor', 'boro', 'borrow', 'bow', 'bowk', 'bowwow', 'brob', 'broo', 'brook', 'brow', 'ko', 'kob', 'koko', 'kor', 'or', 'orb', 'ow', 'owk', 'rob', 'rook', 'row', 'wo', 'wob', 'woo', 'work', 'workbook', 'wow', 'wro']

我非常感谢你的帮助

您还需要测试,对于字典单词中的每个字母,它在字典单词中出现的次数不会比在
“工作簿”
中出现的次数多。例如,您可以使用
str
的方法
count()


当然,最终可能还有其他更有效的方法,但没有必要从头开始来修复现有的问题。

首先通过计算所有单词排列和迭代所有可能的字谜长度来生成所有可能的字谜。然后根据您的
单词
文件
f
过滤
可能的字符

import itertools

def compute_anagrams(word)
    n = len(word) + 1
    permutations = {''.join(p) for p in itertools.permutations(word)}
    potential_anagrams = {p[:i] for i in range(n) for p in permutations}
    return [anagram for anagram in potential_anagrams if anagram in f]
脱硝:

>>> f = ['book', 'bookwork', 'bow', 'row', 'work', 'workbook']
>>> word = 'workbook'
>>> compute_anagrams(words)
['work', 'bow', 'workbook', 'row', 'bookwork', 'book']

我认为你现在的问题太宽泛了,因为你正在寻找替代方法。但是,您可以尝试一些方法。首先,查看类似的内容,以创建输入字符串的可能重新排列。然后将它们与你的字典进行比较(而不是相反的方式),找出哪些是“真实单词”。HTH.可能值得先检查大小,因为如果
math.factorial(len(word))
len(f)
大几个数量级,那么这个算法就糟透了<代码>'workbook'
很好,
'internationalization'
不太好。
>>> f = ['book', 'bookwork', 'bow', 'row', 'work', 'workbook']
>>> word = 'workbook'
>>> compute_anagrams(words)
['work', 'bow', 'workbook', 'row', 'bookwork', 'book']