您当前的代码返回文本文件中最长的行,句号。
如果您想要最长的行是某个输入字符串的字谜,您需要获取一个输入字符串,并过滤掉不是字谜的行。
由于您指定没有重复字母,因此检查两个单词是否是字谜的最简单方法是检查它们是否都具有相同的字母集。所以:
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
。
或者,如果“你不能重复字母”实际上是指“你必须在两个字符串中重复完全相同的字母才能算作字谜”,那也很简单:不是比较字母集,而是比较排序的字母列表:
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)
。