6 votes

Quelles sont ces opérations et pourquoi donnent-elles des résultats différents ?

J'avais vu cette question de test sur Pluralsight :

Étant donné ces ensembles :

x = {'a', 'b', 'c', 'd'}
y = {'c', 'e', 'f'}
z = {'a', 'g', 'h', 'i'}

Quelle est la valeur de x | y ^ z ?

La réponse attendue est :

{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'}

Combine les ensembles (en éliminant automatiquement les doublons), et les ordonne du plus petit au plus grand.

Mes questions sont les suivantes :

  • Comment s'appelle cette expression ?
  • Pourquoi est-ce que j'obtiens 3 résultats différents avec 3 versions différentes de Python ?

Résultat avec Python 3.7.5 sur Ubuntu 18.04 :

{'c', 'h', 'f', 'd', 'b', 'i', 'g', 'a', 'e'}

Résultat sur Python 2.17.17rc1 sur Ubuntu 18.04 :

set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h'])

Résultat sur Python 3.7.2 sur Windows 10 :

{'a', 'd', 'h', 'f', 'b', 'g', 'e', 'c', 'i'}

Voici une copie du même code que j'utilise pour cela : https://repl.it/repls/RudeMoralWorkplace

J'aimerais comprendre ce qui se passe en coulisses avec ces expressions afin de pouvoir démystifier pourquoi j'obtiens des résultats différents.

8voto

CDJB Points 12533

Les opérations en série que vous avez mentionnées sont les suivantes :

^ - différence symétrique (XOR) :

Retourne un nouvel ensemble avec des éléments soit dans l'ensemble, soit dans l'autre, mais pas dans les deux.

Exemple : {'1', '2', '3'} ^ {'2', '3', '4'} = {'1', '4'}

| - syndicat (OR) :

Retourne un nouvel ensemble avec les éléments de l'ensemble et tous les autres.

Exemple : {'1', '2', '3'} | {'2', '3', '4'} = {'1', '2', '3', '4'}

Il existe également d'autres opérations set en python :

& - intersection (ET) :

Retourne un nouvel ensemble avec des éléments communs à l'ensemble et à tous les autres.

Exemple : {'1', '2', '3'} & {'2', '3', '4'} = {'2', '3'}

- - différence :

Retourne un nouvel ensemble avec les éléments de l'ensemble qui ne sont pas dans les autres.

Exemple : {'1', '2', '3'} - {'2', '3', '4'} = {'1'}

L'ordre de préséance pour ces opérations est le suivant -, &, ^, | Ainsi, dans votre exemple, nous appliquons d'abord ^ :

>>> y^z
{'a', 'c', 'e', 'f', 'g', 'h', 'i'}

Et puis | :

>>> x|{'a', 'c', 'e', 'f', 'g', 'h', 'i'}
{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'}

Les différentes sorties que vous décrivez sont en fait le même ensemble, car les ensembles ne sont pas ordonnés.

>>> {'c', 'h', 'f', 'd', 'b', 'i', 'g', 'a', 'e'} == {'a', 'd', 'h', 'f', 'b', 'g', 'e', 'c', 'i'}
True

Tout ordre indiqué dans la représentation de la chaîne d'un ensemble est un détail de mise en œuvre et ne doit pas être invoqué car il varie de manière imprévisible, comme vous l'avez constaté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X