例如,我有两个列表
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?
怎么样
set(A).difference(subset_of_A)
是的,filter功能:
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)给出了预期的结果集,但是它不会保留原来的顺序:
set(A)-set(subset_of_A)
[a for a in A if not a in subset_of_A]
使用 Set类型:
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
但是,仅为这些操作将列表转换为集合并返回的速度比列表内涵要慢。
如果订单不重要,则应使用 set.difference。然而,如果你想保持秩序,一个简单的列表内涵就足够了。
set.difference
result = [a for a in A if a not in subset_of_A]
编辑: 正如德尔南所说,如果 subset_of_A是一个实际的 set,那么性能将大大提高,因为与列表的 O (n)相比,检查 set中的成员是 O (1)。
subset_of_A
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)
会给你答案。