Ask Your Question

# 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[0] if x in L[1]]
show(interL1)
interL2=[x for x in L[0] if (x in L[1] and x in L[2])]
show(interL2)
interL3=[x for x in L[0] if (x in L[1] and x in L[2] and x in L[3])]
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

## 2 Answers

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'}]


Then, you can pop the first set of your list to start with:

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

## Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

## Stats

Asked: 2021-03-08 18:17:54 +0200

Seen: 577 times

Last updated: Mar 08 '21