您当前的代码返回文本文件中最长的行,句号。
如果您想要最长的行是某个输入字符串的字谜,则需要获取一个输入字符串,并过滤掉不是字谜的行。
由于您指定没有重复字母,因此检查两个单词是否是字谜的最简单方法是检查它们是否都具有相同的字母集。所以:
def Words(inputletters):
inputletters = set(inputletters)
qfile=open('dict.txt','r')
long=''
for line in qfile:
if set(line.strip()) == inputletters:
if len(line)>len(long):
long=line
return long
如果您不是在寻找精确匹配,而只是子集,只需将== 替换为.issubset。
或者,如果“你不能重复字母”实际上是指“你必须在两个字符串中完全重复 相同的个字母才能算作字谜”,这也很简单:而不是比较 set 个字母,比较一个排序的列表 个字母:
def Words(inputletters):
inputletters = sorted(inputletters)
qfile=open('dict.txt','r')
long=''
for line in qfile:
if sorted(line.strip()) == inputletters:
if len(line)>len(long):
long=line
return long
等等。一旦您可以准确定义您要搜索的内容,这可能只是对数据结构和/或比较的微不足道的更改。
我不认为这是一个完整的程序,无论你想要什么,但它应该足以 (a) 让你指向正确的方向,或者 (b) 让你澄清问题稍微好一点。
同时,还有一些其他方面您可以改进:
首先,您应该始终关闭您打开的文件(最好使用with 语句)。
虽然我们在这里,但通常的 Python 编码标准(在 PEP 8 中编码)建议使用小写的函数名称。 long 不是一个很好的变量名称——虽然它不再是 Python 3.0 的一种类型,但它可能会使自 2.x 以来一直在使用 Python 的读者感到困惑(在这一点上,它仍然是大多数)。
更有趣的是,就像 Python 中许多简单的 for 循环一样,您的整个循环可以通过使用迭代器转换调用链来替换。结果通常更简洁、更快、更难出错,并且通常更具可读性。
所以,让我们编写另一个版本来改变这一切,并检查子集而不是完整集:
def words(inputletters):
inputletters = set(inputletters)
with open('dict.txt') as qfile:
words = map(str.strip, qfile)
letters = map(set, words)
matching = filter(inputletters.issubset, letters)
longest = max(matching, key=len)
return longest
当然,您可以将其中一些调用合并在一起(或者甚至将整个链变成一个单行,但我认为这可能会推动可读性的界限),或者将它们重写为生成器表达式(组合更多很好——比较 (set(line.strip()) for line in qfile) 和 map(set, map(str.strip, file)) 或 map(lambda line: set(line.strip()), qfile)。