web-dev-qa-db-fra.com

Python définir Union et définir Intersection fonctionnent-ils différemment?

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"?

47
Bilal Akil

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]
79
BrenBarn
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]]))
13
John La Rooy

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])
10
Anto

[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])
1
Hypuk