为什么在真if语句之后此for循环似乎会中断?

时间:2018-08-02 22:14:02

标签: python for-loop if-statement

我发现的所有类似问题都涉及到想要中断for循环,而我不想让我中断。

我有一组由演示文稿标题(字符串)组成的数据,每个数据都与一个出席值配对。我想将每个标题分解为其组成词,并将每个词与最初与标题配对的出勤值配对。我是这样做的,但复杂的是有些单词不是单个单词-我有一些(预定的,包含在我从csv导入的set wordpairsset中)两个单词对,我希望将其视为一个单词(例如“水力压裂”,“鹰福特”。

我在这里拥有的代码几乎可以工作,除了遍历每个标题时,寻找两个单词对(for i in pairs(keyword_lists))的for循环只会运行,直到找到该单词对中的两个单词对为止-然后跳出并进入下一个for循环(for keyword in keyword_list)。因此,对于只包含其中一个特殊的两个单词对之一的标题,一切工作都很好,但是如果它们具有两个两个单词对,则第二个不会被抓住,而是作为两个单独的单词归档。

我发现了this question,并认为这可能是一个迭代与生成器的问题,但是我尝试以一种可迭代的形式重写for i in pairs(keyword_list),但并没有帮助(并且运行得更慢)。

我知道您不应该在Python中使用索引变量,但是在这里我不知道如何使用enumerate()

wordpairsset = set()
for row in wordpairsReader:
    wordpairsset.add(row[0])

def pairs(lst):
    return zip(lst,lst[1:]+[lst[0]])

for row in attendanceReader:
    keyword_list = [x.strip() for x in row[0].split()]

    # First go through and look for common two-word pairs; write to
    # output file with associated attendance data and remove from string
    index = 0
    for i in pairs(keyword_list):
        pair = i[0] + ' ' + i[1]
        if pair in wordpairsset: # test pairs for membership in set
            outputWriter.writerow([pair, row[1]])
            del keyword_list[index]
            if index <= len(keyword_list)-1:
                del keyword_list[index]
        if index <= len(keyword_list)-1:
            index += 1

    # Then go through and write remaining single words with their associated
    # attendance data
    for keyword in keyword_list:
        outputWriter.writerow([keyword, row[1]])

更新-感谢您的帮助!我正在努力使列表理解解决方案适应我的特定问题。我要挂断的两个地方是:

1)当条件为真时,我只是不想从列表中删除元组,我也想向CSV写入一些信息。我想我仍然通过使用for循环来写入csv来解决此问题,但是在列表理解之后将其删除,以删除我编写的项目。 2)我正在遍历zip对象对列表,但这实际上不是我要从中删除项目的内容-我想从keyword_list删除它们,并且如果条件为true,我实际上想删除两个单独的项目,因为keyword_list不不是单词对列表,而是标题中每个单词都有一个实例的列表。

我尝试用以下内容替换以前的for循环,但意识到这是行不通的,因为我对列表的理解不正确-我不是真正的索引,它只是列表中的一个项目;有没有办法解决列表理解中的相邻项目?换句话说,如何使我的if条件不仅取决于特定i的值,还取决于i及其在keyword_list中的邻居的串联?我有道理吗?

    for i in pairslist:
        pair = i[0] + ' ' + i[1]
        if pair in wordpairsset: # test pairs for membership in set
            print(pair, row[1])
            outputWriter.writerow([pair, row[1]])
    keyword_list[:] = [i for i in keyword_list if 
          (keyword_list[i] + ' ' + keyword_list[i+1]) not in wordpairsset and 
          (keyword_list[i-1] + ' ' + keyword_list[i]) not in wordpairsset]

最终更新-这可能不是最好或最优雅的解决方案,但我做到了!当我意识到我根本不需要pair()函数时,我顿悟了。这就是整个过程,减去csv的打开和关闭。

# create a set based on wordpairsFile
wordpairsset = set()
for row in wordpairsReader:
    wordpairsset.add(row[0])

for row in attendanceReader:
    keyword_list = [x.strip() for x in row[0].split()]

    # First go through and look for common two-word pairs; write to
    # output file with associated attendance data and remove from string

    for i in range(len(keyword_list)-2, -1, -1): # loops through the indices of keyword_list in reverse
        if i <= len(keyword_list)-2: # this protects against the case where the last two words of a title are a pair in the set
            pair = keyword_list[i] + ' ' + keyword_list[i+1]
            if pair in wordpairsset:
                outputWriter.writerow([pair, row[1]])
                del keyword_list[i] # for some reason del keyword_list[i:i+1] didn't work, so here we are
                del keyword_list[i]      

    # Then go through and write remaining single words with their associated
    # attendance data
    for keyword in keyword_list:
        outputWriter.writerow([keyword, row[1]])

0 个答案:

没有答案