Tri d'un ensemble de valeurs [fermé]

112

J'ai des valeurs comme celle-ci:

set(['0.000000000', '0.009518000', '10.277200999', '0.030810999', '0.018384000', '4.918560000'])
set(['4.918859000', '0.060758000', '4.917336999', '0.003949999', '0.013945000', '10.281522000', '0.025082999'])  

Je veux trier les valeurs de chacun setdans un ordre croissant. Je ne veux pas trier entre les ensembles, mais les valeurs de chaque ensemble.

Justin Carrey
la source
3
Qu'est-ce que les tuples ont à voir avec le problème et qu'avez-vous essayé?
Fred Foo
3
Je ne pense pas que les ensembles python aient un concept d'ordre. Cela pourrait vous aider: stackoverflow.com/questions/1653970/…
zallarak
3
un ensemble est sans ordre. c'est l'une de ses propriétés. dans toutes les langues. utilisez un list.
Karoly Horvath
4
@KarolyHorvath "un ensemble est sans ordre. C'est l'une de ses propriétés. Dans toutes les langues." C ++ std::setest commandé.
Timothy Shields
17
Pourquoi les gens ont-ils fermé (ou hors sujet) cette question après coup? Oui, il aurait été préférable que l'OP décrive son problème au lieu de nous le faire pêcher. Mais maintenant que nous avons fait cela, et modifié sa question pour qu'elle corresponde, et qu'il a accepté une réponse, je ne vois pas en quoi le vote serré a du sens.
abarnert le

Réponses:

219

À partir d'un commentaire:

Je veux trier chaque ensemble.

C'est facile. Pour tout ensemble s(ou tout autre élément itérable), sorted(s)renvoie une liste des éléments de sdans l'ordre trié:

>>> s = set(['0.000000000', '0.009518000', '10.277200999', '0.030810999', '0.018384000', '4.918560000'])
>>> sorted(s)
['0.000000000', '0.009518000', '0.018384000', '0.030810999', '10.277200999', '4.918560000']

Notez que cela sortedvous donne un list, pas un set. C'est parce que tout l'intérêt d'un ensemble, à la fois en mathématiques et dans presque tous les langages de programmation , * est qu'il n'est pas ordonné: les ensembles {1, 2}et {2, 1}sont le même ensemble.


Vous ne voulez probablement pas vraiment trier ces éléments sous forme de chaînes, mais sous forme de nombres (donc 4.918560000 viendra avant 10.277200999 plutôt qu'après).

La meilleure solution est le plus susceptible de stocker les nombres sous forme de nombres plutôt que de chaînes en premier lieu. Mais sinon, il vous suffit d'utiliser une keyfonction:

>>> sorted(s, key=float)
['0.000000000', '0.009518000', '0.018384000', '0.030810999', '4.918560000', '10.277200999']

Pour plus d'informations, consultez le HOWTO de tri dans la documentation officielle.


* Voir les commentaires pour les exceptions.

Abarnert
la source
1
@TimothyShields: Vous avez raison, j'aurais dû dire "tout langage de programmation qui n'aime pas abuser des termes courants". Dans une langue où "non-modifying" signifie "muting", il n'est pas surprenant que cela setsignifie "liste triée", et vous devez dire unordered_set"set"…
abarnert
2
Que ce nom soit bon ou mauvais n'est pas ce qui fait l'objet de discussions. L'affirmation selon laquelle "les ensembles ne sont jamais ordonnés dans aucune langue" est fausse.
Timothy Shields
5
Vous ne trouverez pas le mot «non ordonné» sur la page Wikipédia concernant un ensemble mathématique. Vous ne trouverez pas non plus le mot «ordonné». C'est parce que ce n'est pas pertinent pour les opérations mathématiques sur les ensembles. La question de savoir si un langage particulier choisit de rendre les ensembles ordonnés est un détail d'implémentation. en.wikipedia.org/wiki/Set_(mathematics)
Timothy Shields
3
@TimothyShields: Pendant ce temps, la page wikipedia sur Set (mathématiques) que vous avez liée n'a pas le mot «non ordonné» car il est déjà évident dans la définition. En particulier, «les ensembles A et B sont égaux si et seulement s'ils ont exactement les mêmes éléments». Ce n'est pas vrai pour les collections commandées. (Il y a aussi des phrases comme: "L'ordre dans lequel les éléments d'un ensemble ou d'un multiset sont listés n'est pas pertinent", donc si vous aviez juste cherché un peu différemment vous auriez pu le trouver même sans comprendre le concept.)
abarnert
3
@TimothyShields: Mais n'expose la commande (non seulement des manières évidentes par l'API, la fonction de commande est en fait une partie du type d'un ensemble donné). Le fait que les éléments soient toujours triés selon un ordre faible strict fait partie de la définition même du concept. Donc, votre argument est sans objet. Mais même si ce n'était pas le cas, pourquoi cela importerait-il? Les ensembles ne sont pas ordonnés dans presque tous les langages de programmation, tout comme ils le sont en mathématiques. Le fait qu'il existe un langage externe qui utilise le mot pour signifier autre chose ne rend pas cette affirmation moins vraie. std::set
abarnert le