web-dev-qa-db-fra.com

Comprendre la fonction set ()

En python, set() est une collection non ordonnée ne contenant aucun élément dupliqué. Cependant, je ne suis pas capable de comprendre comment cela génère la sortie.

Par exemple, considérons ce qui suit:

>>> x = [1, 1, 2, 2, 2, 2, 2, 3, 3]
>>> set(x)
set([1, 2, 3])

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> set(y)
set([8, 1, 6])

>>> z = [1, 1, 6, 6, 6, 6, 6, 7, 7]
>>> set(z)
set([1, 6, 7])

La sortie de set(y) ne devrait-elle pas être: set([1, 6, 8])? J'ai essayé les deux ci-dessus dans Python 2.6.

55
Prakhar Mehrotra

Les ensembles ne sont pas ordonnés, comme vous dites. Même si l'un des moyens d'implémenter des ensembles consiste à utiliser une arborescence, ils peuvent également être implémentés à l'aide d'une table de hachage (obtenir des clés dans un ordre trié peut ne pas être aussi trivial).

Si vous souhaitez les trier, vous pouvez simplement effectuer:

sorted(set(y))

qui produira une liste triée contenant les éléments de l'ensemble. (Pas un ensemble. Encore une fois, les ensembles ne sont pas ordonnés.)

Sinon, la seule chose garantie par set est que les éléments sont uniques (rien ne sera là plus d'une fois).

J'espère que cela t'aides!

67
user

En tant que type de collection non ordonné, set([8, 1, 6]) équivaut à set([1, 6, 8]).

Il serait peut-être plus agréable d’afficher le contenu du jeu dans l’ordre trié, mais cela rendrait l’appel repr() plus coûteux.

En interne, le type set est implémenté à l'aide d'une table de hachage: une fonction de hachage permet de séparer les éléments en plusieurs compartiments afin de réduire le nombre d'opérations d'égalité nécessaires pour vérifier si un élément fait partie de l'ensemble.

Pour produire la sortie repr(), il génère uniquement les éléments de chaque compartiment, ce qui est peu probable.

13
James Henstridge

Comme + Volatility et vous-même l'avez souligné, les ensembles ne sont pas ordonnés. Si vous avez besoin que les éléments soient en ordre, appelez simplement sorted sur le plateau:

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]
6
I82Much

Les ensembles (et les dictionnaires) de Python itéreront et apparaîtront dans un ordre certains, mais exactement quel sera cet ordre sera arbitraire et ne sera pas garanti pour rester le même après les ajouts et les suppressions.

Voici un exemple de modification de l'ordre après l'ajout d'un grand nombre de valeurs, puis leur suppression:

>>> s = set([1,6,8])
>>> print(s)
{8, 1, 6}
>>> s.update(range(10,100000))
>>> for v in range(10, 100000):
    s.remove(v)
>>> print(s)
{1, 6, 8}

Cela dépend toutefois de la mise en œuvre et vous ne devez donc pas vous en fier.

5
Blckknght

Après avoir lu les autres réponses, j'avais toujours du mal à comprendre pourquoi l'ensemble sort sans ordre.

J'ai mentionné cela à mon partenaire et il a proposé cette métaphore: prendre des billes. Vous les mettez dans un tube un peu plus large que la largeur du marbre: vous avez une liste. Un ensemble, cependant, est un sac. Même si vous introduisez les billes une par une dans le sac; Quand vous les renversez d'un sac dans le tube, ils ne seront pas dans le même ordre (car ils ont tous été mélangés dans un sac).

2
Ania