Ask Your Question
1

Multiple intersection between lists

asked 4 years ago

Cyrille gravatar image

updated 4 years ago

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)

Preview: (hide)

2 Answers

Sort by » oldest newest most voted
1

answered 4 years ago

Max Alekseyev gravatar image

updated 4 years ago

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))
Preview: (hide)
link
0

answered 4 years ago

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)
{'D'}
Preview: (hide)
link

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

Stats

Asked: 4 years ago

Seen: 956 times

Last updated: Mar 08 '21