我在 python list_a
和 list_b
中有两个列表。 list_a
有一些图片链接,list_b
也有。 99% 的项目都是一样的,但我必须知道这 1%。所有多余的项目都在 list_a
中,这意味着 list_b
中的所有项目都在 list_a
中。我最初的想法是减去所有项目:
list_a - list_b = list_c
,其中 list_c
是我的剩余元素。我的代码是:
list_a = []
list_b = []
list_c = []
arq_b = open('list_b.txt','r')
for b in arq_b:
list_b.append(b)
arq_a = open('list_a.txt','r')
for a in arq_a:
if a not in arq_b:
list_c.append(a)
arq_c = open('list_c.txt','w')
for c in list_c:
arq_c.write(c)
我认为逻辑是正确的,如果我有一些项目,代码运行得很快。但我没有 10 个项目,或 1.000,甚至 100.000。我的 list_b.txt
和 78.616.777
中有 78.514.022
项在我的列表 list_a.txt
中。我不知道这个表达式的代价:if a not in arq_b
。但是如果我执行这段代码,我认为不会在今年完成。
我的电脑有 8GB,我分配了 15GB 用于交换,以免我的 RAM 爆炸。
我的问题是,还有另一种方法可以让这个操作更高效(更快)吗?
list_a
是纵坐标,而list_b
不是。- 每个项目的尺寸如下:
images/00000cd9fc6ae2fe9ec4bbdb2bf27318f2babc00.png
- 顺序无所谓,我想知道剩余的。
最佳答案
您可以创建一组第一个文件内容,然后根据您所说的差异使用 difference
或 symmetric_difference
with open("list_a.txt") as f:
set_a = set(f)
with open("list_b.txt") as f:
diffs = set_a.difference(f)
如果 list_b.txt
包含比 list_a.txt
更多的项目,您想要交换它们或使用 set_a.symmetric_difference(f)
代替,看你需要什么。
difference(f)
有效,但仍必须在内部构造一个新的 set
。性能提升不大(见 set issubset performance difference depending on the argument type ),但更短。
关于python - 计算两个文件的行差异的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54128876/