我在文件中寻找一个字符串,似乎无法正常工作

时间:2018-03-21 09:35:40

标签: python list file

我的函数首先计算给定单词的所有可能的字谜。然后,对于这些字谜中的每一个,它检查它们是否是有效单词,但检查它们是否等于wordlist.txt文件中的任何单词。该文件是一个包含大量单词的巨型文件。所以我决定只阅读每一行并检查每个anagram是否存在。然而,它出现了空白。这是我的代码:

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有点新意,所以感谢所有的帮助,谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

这将逐行搜索文件,就像使用了open(...).readlines()一样,并尝试匹配整行, '\n' 结尾< / strong>即可。实际上,任何需要迭代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(字长)。

答案 1 :(得分:0)

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

 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

答案 2 :(得分:0)

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

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"))