【问题标题】:Nested for loop in python does not increment the outer for looppython中的嵌套for循环不会增加外部for循环
【发布时间】:2015-09-13 05:40:05
【问题描述】:

我有两个文件:q.txt 包含单词,p.txt 包含句子。我需要检查 q.txt 中的任何单词是否存在于 p.txt 中。以下是我写的:

#!/usr/bin/python
twts=open('p.txt','r');
words=open('q.txt','r');
for wrd in words:
        for iter in twts:
                if (wrd in iter):
                        print "Found at line" +iter

即使有匹配,它也不打印输出。我还可以看到外部 for 循环不会继续到 words 对象中的下一个值。有人可以解释一下我在这里做错了什么吗?

编辑 1:我使用的是 Python 2.7 编辑2:对不起,我混淆了变量名。现在已经更正了。

【问题讨论】:

    标签: python for-loop nested


    【解决方案1】:

    当你迭代一个文件对象时,在完成迭代后,光标会出现在文件的末尾。因此,尝试再次迭代它(在外部 for 循环的下一次迭代中)将不起作用。代码工作的最简单方法是在外部 for 循环的开头寻找文件的开头。示例 -

    #!/usr/bin/python
    words=open('q.txt','r');
    twts=open('p.txt','r');
    for wrd in words:
        twts.seek(0)
        for twt in twts:
            if (wrd.strip() in twt):
                print "Found at line" +iter
    

    另外,根据问题,您似乎使用了错误的文件,twts 应该是带有句子的文件,words 应该是带有单词的文件。但是您已经为 words 打开了 p.txt ,为“句子”打开了 q.txt。如果相反,您应该以其他方式打开文件。

    另外,建议不要使用 iter 作为变量名,因为这也是内置函数的名称,并且您在 - for iter in twts 中定义它 - 隐藏内置函数 - iter() .

    【讨论】:

    • 谢谢,这行得通。但是,不是每次都寻找文件的开头,我们不应该寻找下一个要迭代的单词的开头吗?
    • 下一个单词的开头是什么意思?在外部 for 循环的下一次迭代中,您已经移动到下一个单词。但是由于您已到达文件末尾,因此您的内部循环不会继续。所以你必须从头再来。
    【解决方案2】:

    如果您发布了文件的内容,但您是否从行中删除了\n,会更好吗?这对我有用:

    words = open('words.txt', 'r')
    twts = open('sentences.txt', 'r')
    
    for w in words:
        for t in twts:
            if w.rstrip('\n') in t.rstrip('\n'):
                print w, t
    

    【讨论】:

      【解决方案3】:

      您似乎混淆了这两个文件。你说q.txt 包含单词,但你将p.txt 存储到words 变量中。

      【讨论】:

        【解决方案4】:

        当你用完迭代器后迭代推文时,指针在文件的末尾,所以在第一次迭代后没有什么可以迭代的,你可以重复seek但是如果单词不是一个巨大的文件,您可以制作一组所有单词,因此您只需在 0(n*k) 运行时间内迭代句子文件一次,而不是使用二次解法读取每个单词的每一行您的单词文件,拆分也将匹配确切的单词而不是子字符串:

        from string import punctuation
        with open('p.txt','r') as twts, open('q.txt','r') as words:
            st = set(map(str.rstrip,words))
            for line in twts:
                if any(word.rstrip(punctuation) in st for word in line.split()):
                        print("Found at line {}".format(line))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-04
          • 2015-01-28
          • 2019-04-15
          相关资源
          最近更新 更多