比较两个列表以获得不匹配的元素

时间:2019-05-31 14:39:35

标签: python list

我检查了此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时,我使用相同的代码,我正在寻找一种更快的方法。

4 个答案:

答案 0 :(得分:2)

您可以使用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倍。

答案 1 :(得分:0)

您链接的答案建议使用集合,因为它们使用散列来快速查找事物。 带有列表和in,例如

new_list = [i for i in h if i not in y]

y中的每个i每次都需要检查整个列表h

您可以使用集合,但正如已经指出的那样,请务必小心以防重复丢失。

您可以使用Counter

from collections import Counter

有两个列表的说

l1 = [1,1,2,3,4]
l2 = [3,3,4,5,6]

例如,可以使用每个计数器添加

>>> Counter(l1)
Counter({1: 2, 2: 1, 3: 1, 4: 1})
>>> Counter(l2)
Counter({3: 2, 4: 1, 5: 1, 6: 1})

这只会遍历每个列表一次。 减去它们会得到第一个,而不是第二个:

>>> Counter(l1)-Counter(l2)
Counter({1: 2, 2: 1})

elements告诉您您想要什么

>>> diff = Counter(l1)-Counter(l2)
>>> list(diff.elements())
[1, 1, 2]

答案 2 :(得分:0)

以编程方式使用并保持顺序并处理list1中的重复项

solver = ode(funct, jac=paciJacobian)

输出

def function(list1, list2):
    dic2={}   
    for i in list2:
        try:
            if i in dic2.keys():
                pass
        except KeyError:
            dic2[i]=1           

    result =[]
    for i in list1:
        try:
            if i in dic2.keys():
                pass
        except:
            result.append(i)
    return result



list1=[1,2,2,3]
list2=[3,4,5]

solution = function(list1,list2)
print(solution)

使用@yatu h,y列表,这是时间结果

[1, 2, 2]

答案 3 :(得分:0)

您可以使用集合中的Counter类:

list1 = [1,1,2,3,4]
list2 = [3,3,4,5,6]

from collections import Counter
result = list((Counter(list1)-Counter(list2)).elements())

# [1, 1, 2]

或者,如果您想互相排斥:

count1 = Counter(list1)
count2 = Counter(list2)
r = list((count1-count2+(count2-count1)).elements()) 

# [1, 1, 2, 3, 5, 6]