2016-05-31 40 views
1

我正在尝试使用例如“ 'workbook' 所以结果应该是这样的:工作,工作簿,书籍,书籍,弓,行等如何检查字符串中的字词,即使订单不同 - PYTHON

这是我试过的一种方法,但是这不会找到拼写顺序不同的单词。 (例如,它不会追加“弓”,即使你能重新“工作簿”中的字母写的“弓形”)

f = open('/usr/share/dict/words', 'r') 

test = "workbook" 
anagramlist = [] 

for word in f: 
    if word[:-1] in test and len(word[:-1]) > 2: 
     anagramlist.append(word[:-1]) 
     # this wont append 'bookwork', 'row' etc 

print anagramlist #outputs ['boo', 'book', 'work', 'workbook'] 

另一种方法我试过处理这个问题是使用套。但是这并未”牛逼的工作完全是因为它附加,对于例如有话超过1“W就像‘哇’或‘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'] 

我真的很感谢你的帮助。

+0

我觉得你的问题是因为它是现在,因为你正在寻找替代方法代表过于宽泛。不过,你可能会尝试一些事情。首先,查看['itertools.permutations'](https://docs.python.org/2/library/itertools.html#itertools.permutations)之类的内容,以创建可能的输入字符串重新排列。然后将这些与你的词典(而不是其他方式)进行比较,找出哪些是“真正的单词”.HTH。 –

回答

1

您还需要测试字典单词中的每个字母,它在字典单词中出现的次数不会超过"workbook"。例如,您可以使用str的方法count()来完成此操作。

当然,还有其他一些方法最终可能会更有效率,但没有必要从头开始,以解决您的问题。

2

首先通过计算所有的字排列并迭代所有可能的字母长度来生成所有潜在字典。然后根据您的words文件f过滤potential_anagrams

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] 

Deomonstration:

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

可能值得首先检查大小,因为如果'math.factorial(len(word))'大于'len(f)'的数量级,那么这个算法很糟糕。 “工作簿”没问题,“国际化”不是那么重要。 –

相关问题