xralf
xralf

Reputation: 3642

Intersection of variable number of lists

I define intersection of two lists as follows:

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

For three arguments it would look like:

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

Can I generalize this function for variable number of lists?

The call would look for example like:

>> intersect([1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2])
[2]

EDIT: Python can only achieve it this way?

intersect([
          [1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2]
         ])
[2]

Upvotes: 8

Views: 5289

Answers (2)

Ramesh
Ramesh

Reputation: 406

def intersect(*lists):
    if(len(lists) <=1):
        return lists[0]

    result = lists[0]
    for i in range(1, len(lists)):
        result = set(result) & set(lists[i])

    return list(result)

Call the function just like this...

intersect([1,2],[2,3],[2,4])

Leaving all sanitation to you.

Upvotes: 0

ThiefMaster
ThiefMaster

Reputation: 318508

Use the *-list-to-argument operator and instead of your custom function use set.intersection:

>>> lists = [[1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2]]
>>> list(set.intersection(*map(set, lists)))
[2]

If you want the list-to-set-to-list logic inside a function, you can do it like this:

def intersect(lists):
    return list(set.intersection(*map(set, lists)))

If you prefer intersect() to accept an arbitrary number of arguments instead of a single one, use this instead:

def intersect(*lists):
    return list(set.intersection(*map(set, lists)))

Upvotes: 17

Related Questions