0

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

我的代码是:

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:但对于我的生活,我无法让它工作。我已经阅读和阅读并用谷歌搜索和搜索,但显然我错过了一些东西。有人可以指出我正确的方向吗?

4

2 回答 2

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 是行数,baselistn 是行数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))
于 2012-07-03T01:22:22.780 回答
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']
于 2012-07-03T01:22:15.933 回答