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!
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
>>> p=[ [1,2,3],
[1,9,9],
[1,2,4]]
>>> set(p[0]).intersection(*p)
set([1])
Une solution simple (une ligne) est la suivante:
set.intersection(*[set(list) for list in p])
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])
reduce(lambda x, y: x & y, (set(i) for i in p))
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]
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.