【发布时间】:2017-01-08 04:28:25
【问题描述】:
我正在 Python 2.7 中创建一个 Anagram Solver。
求解器获取用户输入的字谜,将每个字母转换为列表项,然后根据“.txt”文件的行检查列表项,将与字谜字母匹配的任何单词附加到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)
对于没有重复字母的字谜,它可以正常工作,但对于诸如“hello”之类的单词,输出包含诸如“helio、whole、holes”等单词,因为求解器似乎不计算字母' L' 是 2 个单独的条目?
我做错了什么?我觉得我缺少一个简单的解决方案?
谢谢!
【问题讨论】:
-
你的算法太简单了。与其检查
anagram中的每个字符是否都在line中(这不足以识别字谜),不如检查两个字符串中每种字符的计数是否相同。 -
all(x in line + '\n' for x in anagram)是问题所在。如果单词中有“l”,而 anagram 中有 100 个,它仍然会返回True -
可能想看看stackoverflow.com/questions/39028548/… 的一些想法...(实际上是同一个问题)
-
@Ev.Kounis ,感谢您的提醒。我对 Python 还是很陌生,并认为我误解了 all() 函数的应用。我主要是蛮力强迫这条线直到我让它工作,我想没有完全理解它是如何工作的。如果它没有超出这个问题的范围,你能解释一下它的作用吗?
-
获取字谜 (
for x in anagram) 中存在的每个字母并检查它是否存在于行中 (x in line)。all(x,y,z, ..)与x and y and z and ...相同,因此字谜中的所有字母也必须存在于该行中,但该行不能包含更多的 em (len(line) == len(anagram))。请以不同的方式处理换行符。它在那里没有任何地方XD
标签: python list python-2.7 pattern-matching anagram