one-liner to check if at least one item in list exists in another list?

Question:

Lets say I have a list
a=[1,2,3]
And I want to know if at least one of the numbers in it exist in another list, like this one:
b=[4,5,6,7,8,1]
In other words, I want to know if 1,2 or 3 exist(s) in list b.
I now I could do something like

def func(a, b):
    for i in a:
       if i in b:
          return True
    return False

But is there possibly a way to put that in one line to make things tidy?

Asked By: user975135

||

Answers:

There are many ways to do this. The most direct translation is:

any_in = lambda a, b: any(i in b for i in a)

You could also use various things involving sets, such as:

any_in = lambda a, b: bool(set(a).intersection(b))

(which depends on the elements of a being hashable, but if that’s true, it’ll probably be faster to make a set of the larger out of a and b for either of these approaches).

Edit: isdisjoint is better than intersection for Python 2.6 and above, as noted by various people below. Glad to learn about that. 🙂

Answered By: Danica

a simple one-liner would be:

any(i in b for i in a)
Answered By: mata

By converting your lists to sets you can perform set operations on them. If the intersection is larger than 0, you have at least one element matching:

len(set(a) & set(b)) > 0
Answered By: Maehler

This should work.

def func(a, b):
    return any([i in b for i in a])
Answered By: rabbidrabbit

Python 2.6 and above:

def func(a, b):
  return not set(a).isdisjoint(b)

For 2.4 or 2.5:

def func(a, b):
  return len(set(a).intersection(b)) != 0

For 2.3 and below:

sudo apt-get update
sudo apt-get upgrade

😉

Answered By: Thomas

This is a set problem, not a list problem. With the right data type, the answer is often immediately obvious 🙂

def func(a, b):
    return not set(a).isdisjoint(b)
Answered By: Raymond Hettinger
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.