How can I compare two lists in python and return matches How can I compare two lists in python and return matches python python

How can I compare two lists in python and return matches


Not the most efficient one, but by far the most obvious way to do it is:

>>> a = [1, 2, 3, 4, 5]>>> b = [9, 8, 7, 6, 5]>>> set(a) & set(b){5}

if order is significant you can do it with list comprehensions like this:

>>> [i for i, j in zip(a, b) if i == j][5]

(only works for equal-sized lists, which order-significance implies).


Use set.intersection(), it's fast and readable.

>>> set(a).intersection(b)set([5])


A quick performance test showing Lutz's solution is the best:

import timedef speed_test(func):    def wrapper(*args, **kwargs):        t1 = time.time()        for x in xrange(5000):            results = func(*args, **kwargs)        t2 = time.time()        print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)        return results    return wrapper@speed_testdef compare_bitwise(x, y):    set_x = frozenset(x)    set_y = frozenset(y)    return set_x & set_y@speed_testdef compare_listcomp(x, y):    return [i for i, j in zip(x, y) if i == j]@speed_testdef compare_intersect(x, y):    return frozenset(x).intersection(y)# Comparing short listsa = [1, 2, 3, 4, 5]b = [9, 8, 7, 6, 5]compare_bitwise(a, b)compare_listcomp(a, b)compare_intersect(a, b)# Comparing longer listsimport randoma = random.sample(xrange(100000), 10000)b = random.sample(xrange(100000), 10000)compare_bitwise(a, b)compare_listcomp(a, b)compare_intersect(a, b)

These are the results on my machine:

# Short list:compare_bitwise took 10.145 mscompare_listcomp took 11.157 mscompare_intersect took 7.461 ms# Long list:compare_bitwise took 11203.709 mscompare_listcomp took 17361.736 mscompare_intersect took 6833.768 ms

Obviously, any artificial performance test should be taken with a grain of salt, but since the set().intersection() answer is at least as fast as the other solutions, and also the most readable, it should be the standard solution for this common problem.