How to find common elements in list of lists?

Question:

I’m trying to figure out how to compare an n number of lists to find the common elements.
For example:

p=[ [1,2,3],
    [1,9,9],
      ..
      ..
    [1,2,4]

>> print common(p)
>> [1]

Now if I know the number of elements I can do comparions like:

for a in b:
  for c in d:
    for x in y:
...

but that wont work if I don’t know how many elements p has. I’ve looked at this solution that compares two lists
https://stackoverflow.com/a/1388864/1320800

but after spending 4 hrs trying to figure a way to make that recursive, a solution still eludes me so any help would be highly appreciated!

Asked By: 8bits

||

Answers:

You are looking for the set intersection of all the sublists, and the data type you should use for set operations is a set:

result = set(p[0])
for s in p[1:]:
    result.intersection_update(s)
print result
Answered By: Sven Marnach
reduce(lambda x, y: x & y, (set(i) for i in p))
Answered By: Joel Cornett
p=[ [1,2,3],
    [1,9,9],
    [1,2,4]]

ans = [ele[0] for ele in zip(*p) if len(set(ele)) == 1]

Result:

>>> ans
[1]
Answered By: Akavall

Why not just:

set.intersection(*map(set, p))

Result:

set([1])

Or like this:

ip = iter(p)
s = set(next(ip))
s.intersection(*ip)

Result:

set([1])

edit:

copied from console:

>>> p = [[1,2,3], [1,9,9], [1,2,4]]
>>> set.intersection(*map(set, p))
set([1])
>>> ip = iter(p)
>>> s = set(next(ip))
>>> s.intersection(*ip)
set([1])
Answered By: pillmuncher

The set.intersection() method supports intersecting multiple inputs at a time. Use argument unpacking to pull the sublists out of the outer list and pass them into set.intersection() as separate arguments:

>>> p=[ [1,2,3],
        [1,9,9],
        [1,2,4]]

>>> set(p[0]).intersection(*p)
set([1])
Answered By: Raymond Hettinger

A simple solution (one-line) is:

set.intersection(*[set(list) for list in p])
Answered By: WindChimes

You are looking for the set intersection of all the sublists, and the data type you should use for set operations is a set:

result = set(p[0])  
for s in p[1:]:
   result.intersection_update(s)
print result

However, there is a limitation of 10 lists in a list. Anything bigger causes ‘result’ list to be out of order. Assuming you’ve made ‘result’ into a list by list(result).

Make sure you result.sort() to ensure it’s ordered if you depend on it to be that way.

Answered By: spearna
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.