我在 Python 2.7 中创建 Anagram Solver 。
解算器获取用户输入的字谜,将每个字母转换为列表项,然后根据' .txt'的行来检查列表项。文件,将任何与anagram的字母匹配的单词附加到possible_words
列表,准备打印。
它有效...... 差不多!
# Anagram_Solver.py
anagram = list(raw_input("Enter an Anagram: ").lower())
possible_words = []
with file('wordsEn.txt', 'r') as f:
for line in f:
if all(x in line + '\n' for x in anagram) and len(line) == len(anagram) + 1:
line = line.strip()
possible_words.append(line)
print "\n".join(possible_words)
对于没有重复字母的字谜,它可以正常工作,但对于诸如“你好”之类的字样,输出中包含诸如' helio,whole,holes'等字样,如解算器似乎没有计算字母' L'作为2个单独的条目?
我做错了什么?我觉得我找不到一个简单的解决方案吗?
谢谢!
答案 0 :(得分:3)
使用collections.Counter
>>> from collections import Counter
>>> Counter('Hello') == Counter('loleH')
True
>>> Counter('Hello') == Counter('loleHl')
False
Counter
会检查每个字母的字母和次数是否相同。
答案 1 :(得分:1)
您的代码按照预期执行。你实际上没有检查一个字母是否出现两次(或3次以上),只检查if 'l' in word
两次,对于至少有一个l
的所有单词,它总是为真。
一种方法是计算每个单词的字母。如果字母数相等,那么它就是一个字谜。使用collections.Counter类:
可以轻松实现这一点from collections import Counter
anagram = raw_input("Enter an Anagram: ").lower()
with file('wordsEn.txt', 'r') as f:
for line in f:
line = line.strip()
if Counter(anagram) == Counter(line):
possible_words.append(line)
print "\n".join(possible_words)
另一种方法是使用sorted()函数,正如Chris在其他答案的评论中所建议的那样。这会将字谜和线条中的字母按字母顺序排序,然后检查它们是否匹配。此过程比集合方法运行得更快。
anagram = raw_input("Enter an Anagram: ").lower()
with file('wordsEn.txt', 'r') as f:
for line in f:
line = line.strip()
if sorted(anagram) == sorted(line):
possible_words.append(line)
print "\n".join(possible_words)