elfuego1 - 2 years ago 143
Python Question

Python - Intersection of two lists

I know how to get an intersection of two flat lists:

``````b1 = [1,2,3,4,5,9,11,15]
b2 = [4,5,6,7,8]
b3 = [val for val in b1 if val in b2]
``````

or

``````def intersect(a, b):
return list(set(a) & set(b))

print intersect(b1, b2)
``````

But when I have to find intersection for nested lists then my problems starts:

``````c1 = [1, 6, 7, 10, 13, 28, 32, 41, 58, 63]
c2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
``````

In the end I would like to receive:

``````c3 = [[13,32],[7,13,28],[1,6]]
``````

Can you guys give me a hand with this?

Related

Answer Source

If you want:

``````c1 = [1, 6, 7, 10, 13, 28, 32, 41, 58, 63]
c2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
c3 = [[13, 32], [7, 13, 28], [1,6]]
``````

Then here is your solution for Python 2:

``````c3 = [filter(lambda x: x in c1, sublist) for sublist in c2]
``````

In Python 3 `filter` returns an iterable instead of `list`, so you need to wrap `filter` calls with `list()`:

``````c3 = [list(filter(lambda x: x in c1, sublist)) for sublist in c2]
``````

Explanation:

The filter part takes each sublist's item and checks to see if it is in the source list c1. The list comprehension is executed for each sublist in c2.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download