Python 中的数组过滤器?

例如,我有两个列表

 A           = [6, 7, 8, 9, 10, 11, 12]
subset_of_A  = [6, 9, 12]; # the subset of A




the result should be [7, 8, 10, 11]; the remaining elements

Is there a built-in function in python to do this?

234193 次浏览

怎么样

set(A).difference(subset_of_A)

是的,filter功能:

filter(lambda x: x not in subset_of_A, A)

tuple(set([6, 7, 8, 9, 10, 11, 12]).difference([6, 9, 12]))

>>> a = set([6, 7, 8, 9, 10, 11, 12])
>>> sub_a = set([6, 9, 12])
>>> a - sub_a
set([8, 10, 11, 7])

set(A)-set(subset_of_A)给出了预期的结果集,但是它不会保留原来的顺序:

[a for a in A if not a in subset_of_A]

使用 Set类型:

A_set = Set([6,7,8,9,10,11,12])
subset_of_A_set = Set([6,9,12])


result = A_set - subset_of_A_set

这是几天前才问过的问题(但我找不到答案) :

>>> A = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A = set([6, 9, 12])
>>> [i for i in A if i not in subset_of_A]
[7, 8, 10, 11]

根据上下文的不同,从一开始就使用 set可能更好。然后你可以像其他答案一样使用 设定操作

但是,仅为这些操作将列表转换为集合并返回的速度比列表内涵要慢。

如果订单不重要,则应使用 set.difference。然而,如果你想保持秩序,一个简单的列表内涵就足够了。

result = [a for a in A if a not in subset_of_A]

编辑: 正如德尔南所说,如果 subset_of_A是一个实际的 set,那么性能将大大提高,因为与列表的 O (n)相比,检查 set中的成员是 O (1)。

A = [6, 7, 8, 9, 10, 11, 12]
subset_of_A = set([6, 9, 12]) # the subset of A


result = [a for a in A if a not in subset_of_A]
>>> A           = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A  = [6, 9, 12];
>>> set(A) - set(subset_of_A)
set([8, 10, 11, 7])
>>>

不,在 python 中没有内建函数来完成这项工作,因为很简单:

set(A)- set(subset_of_A)

会给你答案。