从显示在外部文本文件中的列表中删除项目

时间:2012-07-03 01:17:58

标签: python list comparison text-files

我正在尝试获取列表并将其与文本文件进行比较,从文本文件中显示的列表中删除元素。

我的代码是:

baselist = open("testfile.txt", 'r')
twolist = ["one","two","three","four","five"]
for y in baselist:
    for x in range(0,len(twolist)):
        print("Working %s vs %s") % (twolist[x], y)
        if twolist[x] == y:
            print("Match!")
            remove.twolist[x]
baselist.close()

当我运行这个时,我可以在输出中看到它正在比较“一对一”等等,显然问题在于if twolist[x] == y:,但对于我的生活,我无法让它工作。我已阅读,阅读和谷歌搜索谷歌,但显然我错过了一些东西。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

  • 打开文件通常最好使用with

  • 从文件中读取时,不会删除换行符;因此,例如'two\n' != 'two',您的比较测试失败。使用.strip()或.rstrip()删除包含尾随换行符的空格

  • for index in range(len(mylist))通常是个坏兆头;最好在列表for value in mylist上操作,并将其过滤为[value for value in mylist if test(value)]

  • 您的第一个print语句错误地缩进

  • 您的remove语法错误;应为twolist.remove(x),并注意这只会删除x

  • 第一次出现
  • 您的算法是O(mn),其中m是baselist中的行数,n是twolist中的行数;有点小心,可能是O(m + n)。

如果原始订单很重要,

with open('testfile.txt') as inf:
    twoset = set(twolist).difference(line.strip() for line in inf)

twolist = [item for item in twolist if item in twoset]

否则,

with open('testfile.txt') as inf:
    twolist = list(set(twolist).difference(line.strip() for line in inf))

答案 1 :(得分:0)

你错过了rstrip()

if twolist[x] == y.rstrip():

迭代时不要修改列表。

更好地使用列表理解,并使用集合使其更快:

$ cat 1.py 
baselist = set([x.rstrip('\n') for x in open("testfile.txt", 'r')])
twolist = ["one","two","three","four","five"]
baselist = [x for x in twolist if x not in baselist]
print baselist

$ cat testfile.txt 
one
three

$ python 1.py 
['two', 'four', 'five']