小能豆

Python If == true 语句仅在 readline 的最后一行起作用

py

我的函数只说单词文件中的最后一个单词是字谜(第一个辅助函数)。但文件中的每个单词都是我测试的单词的字谜,并使用主函数之外的辅助函数独立返回 true。我不确定它是否与/n字符串的一部分有关,然后它对此进行了解释,但我尝试放入一个 if 语句,表示如果它在那里则删除它,但这也不起作用。我还进行了测试以确保它正在运行.txt文件中的每个单词,并且确实如此。

def is_anagram(string1, string2):
    """Returns True if the two strings are anagrams of eachother.

    str, str -> bool"""
    if sorted(string1)==sorted(string2):
        return True
    else:
        return False


def find_anagrams(word):
    final = []
    content = open("small_list.txt")
    content.close
    while True:
        line = content.readline()
        print(line)
        if is_anagram(word, line) == True:
            print("bruh")
            final.append(line)
        elif line == '':
             break
    return final

阅读 23

收藏
2024-12-06

共1个答案

小能豆

根据您用来读取一行的方法 ( file.readline),这是预料之中的。摘自文档

f.readline()从文件中读取一行;\n字符串末尾留有一个换行符 ( ),并且仅当文件没有以换行符结尾时才会在文件的最后一行省略换行符。

您的line代码后面有一个换行符,但word实际上没有。因此,最后您需要做的就是进行以下更改:

line = content.readline().rstrip()

好吧,这就是让它工作所需的全部更改。此外,我还建议使用with...as上下文管理器来处理文件 I/O。这是很好的做法,你会为此感谢自己。

with open("small_list.txt") as f:
    for line in f:
        if is_anagram(word, line.rstrip()):
            ... # do something here

最好使用for循环来迭代文件的行(而不是while,这样更简洁)。此外,使用上下文管理器时无需显式调用f.close()(您目前没有这样做,您只是引用该方法而没有实际调用它)。


结合这个答案中的@Christian Dean 的建议,您也可以简化您的 anagram 函数 -在一行中调用sorted 并返回结果:

def is_anagram(a, b):
    return sorted(a) == sorted(b)
2024-12-06