Je suis en train de faire quelques opérations en Python, et j'ai remarqué quelque chose d'étrange.
>> set([1,2,3]) | set([2,3,4])
set([1, 2, 3, 4])
>> set().union(*[[1,2,3], [2,3,4]])
set([1, 2, 3, 4])
C'est bien, comportement attendu - mais avec intersection:
>> set([1,2,3]) & set([2,3,4])
set([2, 3])
>> set().intersection(*[[1,2,3], [2,3,4]])
set([])
Est-ce que je perds la tête ici? Pourquoi set.intersection () ne fonctionne-t-il pas comme prévu?
Comment puis-je faire l'intersection de plusieurs ensembles comme je le faisais avec l'union (en supposant que le [[1,2,3], [2,3,4]]
Contenait beaucoup plus de listes)? Quelle serait la manière "pythonique"?
Lorsque vous faites set()
, vous créez un ensemble vide. Lorsque vous faites set().intersection(...)
, vous intersectez cet ensemble vide avec d'autres éléments. L'intersection d'un ensemble vide avec une autre collection d'ensembles est vide.
Si vous avez réellement une liste de ensembles, vous pouvez obtenir leur intersection similaire à la façon dont vous l'avez faite.
>>> x = [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}]
>>> set.intersection(*x)
set([3])
Cependant, vous ne pouvez pas le faire directement avec la façon dont vous le faites, car vous n'avez en réalité aucun ensemble dans votre exemple avec intersection(*...)
. Vous avez juste une liste de listes. Vous devez d’abord convertir les éléments de votre liste en ensembles. Donc si vous avez
x = [[1,2,3], [2,3,4]]
tu devrais faire
x = [set(a) for a in x]
set().intersection(*[[1,2,3], [2,3,4]])
est bien sûr vide car vous commencez avec le jeu vide et le croisez avec tous les autres
Vous pouvez essayer d'appeler la méthode sur le class
set.intersection(*[[1,2,3], [2,3,4]])
mais cela ne fonctionnera pas parce que le premier argument passé doit être un ensemble
set.intersection({1, 2, 3}, *[[2,3,4], ...])
Cela semble bizarre, mieux si vous pouviez utiliser une liste d'ensembles en premier lieu. Surtout s'ils proviennent d'un groupe électrogène, ce qui rend difficile l'extraction proprement du premier article
set.intersection(*[{1,2,3}, {2,3,4}])
Sinon, vous pouvez simplement faire tous les ensembles
set.intersection(*(set(x) for x in [[1,2,3], [2,3,4]]))
convertir la liste en premier
>>> set.intersection(*[set([1,2,3]), set([2,3,4])])
set([2, 3])
Pour plusieurs listes, vous pouvez simplement utiliser,
>>> set.intersection(*[set([1,2,3]), set([2,3,4]), set([5,3,4])])
set([3])
[Supprimé réponse incorrecte]
Comme @Anto Vinish l'a suggéré, vous devez d'abord convertir les listes en ensembles, puis utiliser set.intersection.
Par exemple:
>>> sets = [set([1, 2, 3]), set([2, 3, 4]), set([3, 4, 5])]
>>> set.intersection(*sets)
set([3])