我在文件中查找字符串,似乎不起作用

2024-07-04 08:52:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我的函数首先计算给定单词的所有可能的字谜。然后,对于每一个这些字谜,它检查它们是否是有效的词,但检查它们是否等于wordlist.txt文件文件。这个文件是一个巨大的文件,一行一行地写着一堆字。所以我决定读每一行,看看每一个字母是否都有。然而,结果却是一片空白。这是我的密码:

def perm1(lst):
    if len(lst) == 0:
        return []
    elif len(lst) == 1:
        return [lst]
    else:
        l = []
        for i in range(len(lst)):
            x = lst[i]
            xs = lst[:i] + lst[i+1:]
            for p in perm1(xs):
                l.append([x] + p)
        return l
def jumbo_solve(string):
    '''jumbo_solve(string) -> list
    returns list of valid words that are anagrams of string'''
    passer = list(string)
    allAnagrams = []
    validWords = []
    for x in perm1(passer):
        allAnagrams.append((''.join(x)))
    for x in allAnagrams:
        if x in open("C:\\Users\\Chris\\Python\\wordlist.txt"):
            validWords.append(x)
    return(validWords)
print(jumbo_solve("rarom"))

如果已经放入许多print语句进行调试,并且传入的列表“allAnagrams”功能齐全。例如,输入“rarom”时,一个有效的anagram是单词“armor”,它包含在wordlist.txt文件文件。但是,当我运行它时,它不会检测到是否出于某种原因。再次感谢,我对Python还是有点陌生,所以非常感谢所有的帮助,谢谢!你知道吗


Tags: 文件intxtforstringlenreturnlist
3条回答

您以错误的方式使用了以下代码:

 if x in open("C:\\Users\\Chris\\Python\\wordlist.txt"):

相反,请尝试以下代码,它应该可以解决您的问题:

with open("words.txt", "r") as file:
    lines = file.read().splitlines()

    for line in lines:
        # do something here

你错过了一个很小但很重要的方面:

word in open("C:\\Users\\Chris\\Python\\wordlist.txt")

这将逐行搜索文件,就像使用open(...).readlines()一样,并尝试将整行与'\n'匹配,最后。实际上,任何需要在open(...)上迭代的操作都像readlines()。你知道吗

你需要 x+'\n' in open("C:\\Users\\Chris\\Python\\wordlist.txt")

如果文件是一个单独行上的单词列表,则可以通过此操作修复现有的内容,但在每个函数调用上执行此操作效率很低。最好做一次:

wordlist = open("C:\\Users\\Chris\\Python\\wordlist.txt").read().split('\n')

如果文件是以'\n'分隔的单词列表,这将创建一个单词列表。请注意,您可以使用

`readlines()`

而不是read().split('\n'),但这将保持\n在每个单词上,就像你有,你需要包括在你的搜索中,如我上面所示。现在您可以将列表用作全局变量或函数参数。你知道吗

if x in wordlist: stuff

注:Graphier在评论中提出了一项重要建议。一套:

wordlist = set(open("C:\\Users\\Chris\\Python\\wordlist.txt").read().split('\n'))

它比列表更适合于单词查找,因为它是O(单词长度)。你知道吗

因此,将所有建议放在一起,您的代码可以简单到:

from itertools import permutations

def get_valid_words(file_name):
    with open(file_name) as f:
        return set(line.strip() for line in f)

def jumbo_solve(s, valid_words=None):
    """jumbo_solve(s: str) -> list
    returns list of valid words that are anagrams of `s`"""
    if valid_words is None:
        valid_words = get_valid_words("C:\\Users\\Chris\\Python\\wordlist.txt")
    return [word for word in permutations(s) if word in valid_words]

if __name__ == "__main__":
    print(jumbo_solve("rarom"))

相关问题 更多 >

    热门问题