Classificando um conjunto de valores [fechado]

112

Tenho valores como este:

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'])  

Quero classificar os valores em cada uma setem ordem crescente. Não quero classificar entre os conjuntos, mas os valores em cada conjunto.

Justin Carrey
fonte
3
O que as tuplas têm a ver com o problema e o que você tentou?
Fred Foo
3
Não acho que os conjuntos python tenham um conceito de ordenação. Isso pode ajudá-lo: stackoverflow.com/questions/1653970/…
zallarak
3
um conjunto não tem ordem. essa é uma de suas propriedades. em todas as línguas. use um list.
Karoly Horvath
4
@KarolyHorvath "um conjunto não tem ordem. Essa é uma de suas propriedades. Em todos os idiomas." C ++ std::setestá ordenado.
Timothy Shields
17
Por que as pessoas fecharam (ou saíram do assunto) esta questão depois do fato? Sim, teria sido melhor se o OP tivesse descrito seu problema em vez de nos obrigar a retirá-lo dele. Mas agora que fizemos isso e editamos sua pergunta para corresponder, e ele aceitou uma resposta, não vejo como a votação fechada faz sentido.
abarnert

Respostas:

218

De um comentário:

Eu quero classificar cada conjunto.

Isso é fácil. Para qualquer conjunto s(ou qualquer outra coisa iterável), sorted(s)retorna uma lista dos elementos de sna ordem de classificação:

>>> 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']

Observe que sortedestá dando a você um list, não um set. Isso porque todo o objetivo de um conjunto, tanto na matemática quanto em quase todas as linguagens de programação , * é que ele não é ordenado: os conjuntos {1, 2}e {2, 1}são o mesmo conjunto.


Você provavelmente não deseja classificar esses elementos como strings, mas como números (então 4,918560000 virá antes de 10.277200999, e não depois).

A melhor solução provavelmente é armazenar os números como números em vez de strings. Mas se não, você só precisa usar uma keyfunção:

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

Para mais informações, veja o Sorting HOWTO na documentação oficial.


* Veja os comentários para exceções.

abarnert
fonte
1
@TimothyShields: Você está certo, eu deveria ter dito "todas as linguagens de programação que não gostam de fazer uso indevido de termos comuns". Em uma linguagem onde "não modificadora" significa "mutante", não é surpreendente que setsignifique "lista ordenada", e você tem que dizer unordered_setque significa "definir" ...
abarnert
2
Se esse nome é bom ou ruim não está em discussão. A afirmação de que "os conjuntos nunca são ordenados em nenhum idioma" é falsa.
Timothy Shields
5
Você não encontrará a palavra "desordenado" na página da Wikipedia sobre um conjunto matemático. Você também não encontrará a palavra "encomendado". Isso porque é irrelevante para operações matemáticas em conjuntos. Se uma determinada linguagem escolhe fazer conjuntos ordenados é um detalhe de implementação. en.wikipedia.org/wiki/Set_(mathematics)
Timothy Shields
3
@TimothyShields: Enquanto isso, a página da wikipedia em Set (matemática) que você vinculou não contém a palavra "desordenado" porque já é óbvio pela definição. Em particular, "os conjuntos A e B são iguais se e somente se eles tiverem exatamente os mesmos elementos". Isso não é verdade para coleções ordenadas. (Existem também frases como: "A ordem em que os elementos de um conjunto ou multiset são listados é irrelevante", portanto, se você tivesse pesquisado de maneira um pouco diferente, poderia ter encontrado mesmo sem entender o conceito.)
abarnert
3
@TimothyShields: Mas std::set não expor a ordenação (e não apenas nas maneiras óbvias através da API; a função de ordenação é, na verdade, parte do tipo de qualquer dado conjunto). O fato de que os elementos são sempre mantidos ordenados por uma ordem estrita e fraca faz parte da própria definição do conceito. Portanto, seu argumento é discutível. Mas mesmo se não fosse, por que isso importaria? Os conjuntos são desordenados em quase todas as linguagens de programação, assim como na matemática. O fato de haver uma linguagem remota que usa a palavra para significar outra coisa não torna essa afirmação menos verdadeira.
abarnert