efficiently knowing if intersection of two list is empty or not, in python [duplicate] efficiently knowing if intersection of two list is empty or not, in python [duplicate] python python

efficiently knowing if intersection of two list is empty or not, in python [duplicate]


Or more concisely

if set(L) & set(M):    # there is an intersectionelse:    # no intersection

If you really need True or False

bool(set(L) & set(M))

After running some timings, this seems to be a good option to try too

m_set=set(M)any(x in m_set  for x in L)

If the items in M or L are not hashable you have to use a less efficient approach like this

any(x in M for x in L)

Here are some timings for 100 item lists. Using sets is considerably faster when there is no intersection, and a bit slower when there is a considerable intersection.

M=range(100)L=range(100,200)timeit set(L) & set(M)10000 loops, best of 3: 32.3 µs per looptimeit any(x in M for x in L)1000 loops, best of 3: 374 µs per looptimeit m_set=frozenset(M);any(x in m_set  for x in L)10000 loops, best of 3: 31 µs per loopL=range(50,150)timeit set(L) & set(M)10000 loops, best of 3: 18 µs per looptimeit any(x in M for x in L)100000 loops, best of 3: 4.88 µs per looptimeit m_set=frozenset(M);any(x in m_set  for x in L)100000 loops, best of 3: 9.39 µs per loop# Now for some random listsimport randomL=[random.randrange(200000) for x in xrange(1000)]M=[random.randrange(200000) for x in xrange(1000)]timeit set(L) & set(M)1000 loops, best of 3: 420 µs per looptimeit any(x in M for x in L)10 loops, best of 3: 21.2 ms per looptimeit m_set=set(M);any(x in m_set  for x in L)1000 loops, best of 3: 168 µs per looptimeit m_set=frozenset(M);any(x in m_set  for x in L)1000 loops, best of 3: 371 µs per loop


To avoid the work of constructing the intersection, and produce an answer as soon as we know that they intersect:

m_set = frozenset(M)return any(x in m_set for x in L)

Update: gnibbler tried this out and found it to run faster with set() in place of frozenset(). Whaddayaknow.


First of all, if you do not need them ordered, then switch to the set type.

If you still need the list type, then do it this way: 0 == False

len(set.intersection(set(L), set(M)))