132

For example, I have two lists

 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?

0

10 Answers 10

178

If the order is not important, you should use set.difference. However, if you want to retain order, a simple list comprehension is all it takes.

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

EDIT: As delnan says, performance will be substantially improved if subset_of_A is an actual set, since checking for membership in a set is O(1) as compared to O(n) for a list.

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]
Sign up to request clarification or add additional context in comments.

1 Comment

And this can be improved vastly by making subset_of_A a real set, which gives O(1) membership test (instead of O(n) as with lists).
110

Yes, the filter function:

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

2 Comments

Note that in Python 2, filter returns the list itself, while in Python 3, it returns an iterator.
@modulitos list(filter(...))
11

set(A)-set(subset_of_A) gives your the intended result set, but it won't retain the original order. The following is order preserving:

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

1 Comment

This is wrong, it should be "if a not in", NOT "if not a in"
9

No, there is no build in function in python to do this, because simply:

set(A)- set(subset_of_A)

will provide you the answer.

2 Comments

While this works for his example, there may be problems if elements are repeated in the list A.
@AlokMysore Yet, doesn't set() remove duplicates by precisely making the array a set?
5

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

Comments

4

How about

set(A).difference(subset_of_A)

Comments

3

This was just asked a couple of days ago (but I cannot find it):

>>> 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]

It might be better to use sets from the beginning, depending on the context. Then you can use set operations like other answers show.

However, converting lists to sets and back only for these operations is slower than list comprehension.

Comments

2

Use the Set type:

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

Comments

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

Comments

1
>>> 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])
>>> 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.