我正在尝试获取列表并将其与文本文件进行比较,从文本文件中显示的列表中删除元素。
我的代码是:
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:
,但对于我的生活,我无法让它工作。我已阅读,阅读和谷歌搜索谷歌,但显然我错过了一些东西。有人能指出我正确的方向吗?
答案 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']