Ask Your Question

Multiple intersection between lists

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

Cyrille gravatar image

updated 2021-03-08 18:18:40 +0200

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

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 flag offensive close merge delete

2 Answers

Sort by ยป oldest newest most voted

answered 2021-03-08 18:38:56 +0200

Max Alekseyev gravatar image

updated 2021-03-08 18:43:51 +0200

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))
edit flag offensive delete link more

answered 2021-03-08 18:50:27 +0200

tmonteil gravatar image

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)
edit flag offensive delete link more

Your Answer

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

Add Answer

Question Tools

1 follower


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

Seen: 557 times

Last updated: Mar 08 '21