# Multiple intersection between lists

This is a toy example. Suppose I have a lot of lists (whose the number is not fixed as in the example and I want to determine the intersection of the list like

L=[["B", "C", "D", "E"],["A", "C", "D"],["A", "B","D", "E"], ["A", "B","D", "C"] ]
show(L)
interL1=[x for x in L if x in L]
show(interL1)
interL2=[x for x in L if (x in L and x in L)]
show(interL2)
interL3=[x for x in L if (x in L and x in L and x in L)]
show(interL2)


But, as the number of list (here 4), I would like to know if there is a possibility to define an operator and like and(L[i],i,0, 3)

edit retag close merge delete

Sort by » oldest newest most voted Since you talk about intersection, it is easier to convert lists to sets and use set.intersection function, like this:

L=[["B", "C", "D", "E"],["A", "C", "D"],["A", "B","D", "E"], ["A", "B","D", "C"] ]
set.intersection(*(set(Li) for Li in L))

more

A better data structure than lists to make intersectoins is set, so you can first transform your list of lists into a list of sets:

sage: Lset = [set(l) for l in L]
sage: Lset
[{'B', 'C', 'D', 'E'},
{'A', 'C', 'D'},
{'A', 'B', 'D', 'E'},
{'A', 'B', 'C', 'D'}]


sage: s = Lset.pop()
sage: s
{'A', 'B', 'C', 'D'}
sage: Lset
[{'B', 'C', 'D', 'E'}, {'A', 'C', 'D'}, {'A', 'B', 'D', 'E'}]


Now you can intersect s with the remaining sets in Lset:

sage: s.intersection(*Lset)
{'D'}

more