Reputation: 3642
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
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
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