【问题标题】:I'm looking for a string in a file, seems to not be working我正在寻找文件中的字符串,似乎无法正常工作
【发布时间】:2018-03-21 09:35:40
【问题描述】:

我的函数首先计算给定单词的所有可能的字谜。然后,对于这些字谜中的每一个,它会检查它们是否是有效单词,但会检查它们是否等于 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"))

如果已放入许多打印语句进行调试,并且传入的列表“allAnagrams”功能齐全。例如,输入“rarom”时,一个有效的字谜是单词“armor”,它包含在 wordlist.txt 文件中。但是,当我运行它时,由于某种原因它没有检测到。再次感谢,我'我对 Python 还是有点陌生​​,所以感谢所有帮助,谢谢!

【问题讨论】:

  • 请注意,您的perm1 函数可以替换为对itertools.permutations() 的调用。
  • 您的解决方案具有非常高的复杂性,可以根据各种约束以多种方式降低......

标签: python list file


【解决方案1】:

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

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

Note Graphier 在 cmets 中提出了一个重要的建议。一套:

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

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

【讨论】:

  • 由于您只读取文件一次,不妨将其存储在set 中以获得O(1) 的时间复杂度为in
  • 非常感谢卡巴努斯!你的回答真的很有帮助,我完全理解为什么我的程序在这里搞砸了。谢谢
【解决方案2】:

您错误地使用了以下代码:

 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

【讨论】:

  • 糟糕,感谢您的澄清。我不知道您可以以这种方式使用文件对象。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 2012-05-06
    • 2013-02-17
    • 2017-10-09
    • 2017-08-03
    • 2014-05-02
    • 2011-09-11
    • 2016-02-11
    相关资源
    最近更新 更多