# python - Most efficient way of checking list membership of more that one value

Take the following code:

``a = [1,2,3,4]if 1 in a or 2 in a:print 'found'``

Is there a cleaner/more elegant way of doing this? Perhaps:

``a = [1,2,3,4]b = [1,2]if set(a) & set(b):print found``

``````a = [1,2,3,4]
b = [1,2]

print any(x in a for x in b)
True
``````

Your second example based on `set` doesn't work because it will always return `True` for non-empty `a`/`b`. However sets are likely the right to use:

``````if set(b).issubset(set(a)):
print "found"
``````

Please note that `b = set([])` is always a subset of `set(a)`.

Update: I just noticed that you only want to know if any of the items in `b` is part of `a` which is different from my proposed solution. In that case I think a simple if/elif/else is the best solution. You could try to use a dict or another iterable with fast contains-lookup.

Maybe this is too simple, but `if...elif` seems fine to me:

``````found = False

if 1 in a:
found = True
elif 2 in a:
found = True
``````

This only checks if `2` is in the list if `1` isn't, since you're only looking to see if either is in the list (not caring which one), this should be good

Pros:

• Its simple
• You can save a check on `2` if `1` is already in the list
• No need to convert `a` to a different type (which aides efficiency)

Cons:

• This won't get you any points for flair

Timing Comparison:

``````basecase = """
a = [1,2,3,4]
if 1 in a or 2 in a:
print 'found'
"""

case1 = """
a = [1,2,3,4]
b = [1,2]
if set(b).issubset(set(a)):
print 'found'
"""

case2 = """
found = False
if 1 in a:
found = True
elif 2 in a:
found = True
"""

case3 = """
a = [1,2,3,4]
b = [1,2]
print any(x in a for x in b)
"""
``````

Using `print min(timeit.Timer(<case>).repeat(8, 1000))` yields

``````basecase = 0.0953138421204
case1 = 0.0974782045301
case2 = 0.0958207179797
case3 = 0.068283250742
``````

You can try

``````if set(a) <= set(b):
print found
``````

But I can't tell if it's more efficient than your code.