我发现的所有类似问题都涉及到想要中断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]])