问题
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]
回答1:
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)))
回答2:
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.
来源:https://stackoverflow.com/questions/10861236/intersection-of-variable-number-of-lists