Python 尝试删除从文本文件创建的列表的项

Python 尝试删除从文本文件创建的列表的项,python,list,Python,List,我打开两个文件,将其中的数据读入两个列表 with open('file1.txt', 'r') as file: data_list1 = [line.strip() for line in file] with open('file2.txt', 'r') as file: data_list2 = [line.strip() for line in file] for each in list1: if each in list2: list1.re

我打开两个文件,将其中的数据读入两个列表

with open('file1.txt', 'r') as file:
     data_list1 = [line.strip() for line in file]
with open('file2.txt', 'r') as file:
     data_list2 = [line.strip() for line in file]

for each in list1:
   if each in list2:
      list1.remove(each)
在此之后,我迭代第一个列表,并尝试删除第二个列表中也出现的元素

for each in data_list1:
    print(each)
我从第二个列表中得到了重复的结果。

使用,而不是使用
remove()的循环。

for each in data_list1:
    print(each)
使用
remove()。如果您确实希望在迭代时从列表中删除元素,那么一个好的解决方案是在reverse中迭代列表的索引(从列表末尾开始),并使用:


您不应该尝试从正在迭代的列表中删除项目。在这里,一种可能的方法是在读取第二个文件时从第一个列表中筛选出元素:

with open('file1.txt', 'r') as file:
     data_list1 = [line.strip() for line in file]
with open('file2.txt', 'r') as file:
     data_list2 = list(filter(lambda x: x not in data_list1, line.strip() for line in file))
但是,如果列表很大,则从第一个列表构建一个集合可能会更有效,因为在集合中搜索要比在列表中搜索快得多:

with open('file1.txt', 'r') as file:
     data_list1 = [line.strip() for line in file]
data_set1 = set(data_list1)
with open('file2.txt', 'r') as file:
     data_list2 = list(filter(lambda x: x not in data_set1, line.strip() for line in file))

查看。
remove
将只删除元素的第一个匹配项。元素只有一个在第一个列表中没有重复。在迭代时不要从列表中删除元素。这是许多可能问题的根源。相关:
with open('file1.txt', 'r') as file:
     data_list1 = [line.strip() for line in file]
data_set1 = set(data_list1)
with open('file2.txt', 'r') as file:
     data_list2 = list(filter(lambda x: x not in data_set1, line.strip() for line in file))