web-dev-qa-db-fra.com

Comment trouver des éléments communs dans une liste de listes?

J'essaie de comprendre comment comparer un nombre n de listes pour trouver les éléments communs. Par exemple:

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

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

Maintenant, si je connais le nombre d'éléments, je peux faire des comparaisons comme:

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

mais cela ne fonctionnera pas si je ne sais pas combien d'éléments p a. J'ai examiné cette solution qui compare deux listes https://stackoverflow.com/a/1388864/1320800

mais après avoir passé 4 heures à essayer de trouver un moyen de rendre cela récursif, une solution m’échappe toujours, aussi toute aide serait très appréciée!

21
8bits

Vous recherchez l'intersection d'ensemble de toutes les sous-listes et le type de données que vous devez utiliser pour les opérations d'ensemble est un ensemble:

result = set(p[0])
for s in p[1:]:
    result.intersection_update(s)
print result
42
Sven Marnach
>>> p=[ [1,2,3],
    [1,9,9],
    [1,2,4]]
>>> set(p[0]).intersection(*p)
set([1])
15

Une solution simple (une ligne) est la suivante:

set.intersection(*[set(list) for list in p])
5
WindChimes

Pourquoi pas simplement:

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

Résultat:

set([1])

Ou comme ceci:

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

Résultat:

set([1])

modifier:

copié depuis la 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])
5
pillmuncher
reduce(lambda x, y: x & y, (set(i) for i in p))
1
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]

Résultat:

>>> ans
[1]
1
Akavall

Vous recherchez l'intersection d'ensemble de toutes les sous-listes et le type de données que vous devez utiliser pour les opérations d'ensemble est un ensemble:

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

Cependant, il y a une limite de 10 listes dans une liste. Tout ce qui est plus gros cause que la liste de résultats soit en panne. En supposant que vous ayez transformé le résultat en une liste de list(result).

Assurez-vous de result.sort() pour vous assurer qu'il est commandé si vous en dépendez. 

0
spearna