我检查了这个comparing lists,只有一个答案与我要执行的操作有关。我必须列出一些类似的元素,我想获得不匹配的元素。

len(h) = 1973182  #h[0] = 'B00006J8F4F2', y[0] = 'B0075Y2X2GO6'
len(y) = 656890


我在做

new_list = [i for i in h if i not in y],但这需要大约13分钟的时间,是否有更快的方法?

在引用“重复”问题Finding elements not in a list时,我使用相同的代码,我正在寻找一种更快的方法。

最佳答案

您可以使用sets更有效地查找两个列表之间的差异。如果需要将订单保留在原始列表中,可以将sortedkey一起使用。

我们要根据集合中元素在原始列表中的出现对它们进行排序,因此一种方法是构建查找字典。我们可以使用enumerate。然后,我们只需要作为key函数在字典上查找:

d = {j:i for i,j in enumerate(h)}
new_list  = sorted(list((set(h) - set(y))), key = lambda x: d[x])




让我们尝试一个简单的例子:

y = range(5)
h = range(7)
d = {j:i for i,j in enumerate(h)}
sorted(list((set(h) - set(y))), key = lambda x: d[x])
# [5, 6]




时间-

import random
y = random.sample(range(1, 10001), 10000)
h = random.sample(range(1, 20001), 10000)

%timeit [i for i in h if i not in y]
# 1.28 s ± 37.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

def using_sets(a,b):
    d = {j:i for i,j in enumerate(a)}
    sorted(list((set(a) - set(b))), key = lambda x: d[x])

%timeit using_sets(h,y)
# 6.16 ms ± 373 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)




因此,有了明显的改进,提议的方法执行速度提高了200倍。

关于python - 比较两个列表以获得不匹配的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56397129/

10-14 18:06
查看更多