Ordinamento di un insieme di valori [chiuso]


112

Ho valori come questo:

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

Voglio ordinare i valori in ciascuno setin ordine crescente. Non voglio ordinare tra i set, ma i valori in ogni set.


3
Cosa hanno a che fare le tuple con il problema e cosa hai provato?
Fred Foo

3
Non penso che i set Python abbiano un concetto di ordinamento. Questo potrebbe aiutare a: stackoverflow.com/questions/1653970/...
zallarak

3
un set è senza ordine. questa è una delle sue proprietà. in ogni lingua. usa un file list.
Karoly Horvath

4
@KarolyHorvath "un set è senza ordine. Questa è una delle sue proprietà. In ogni lingua." std::setViene ordinato il C ++ .
Timothy Shields

17
Perché le persone hanno chiuso (o fuori tema) questa domanda dopo il fatto? Sì, sarebbe stato meglio se l'OP avesse descritto il suo problema invece di farcelo pescare. Ma ora che l'abbiamo fatto, e modificato la sua domanda in modo che corrisponda, e ha accettato una risposta, non vedo come abbia senso il voto ravvicinato.
abarnert

Risposte:


218

Da un commento:

Voglio ordinare ogni set.

Questo è facile. Per qualsiasi set s(o qualsiasi altra cosa iterabile), sorted(s)restituisce un elenco degli elementi di sin ordine ordinato:

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

Nota che ti sortedsta dando un list, non un set. Questo perché il punto centrale di un insieme, sia in matematica che in quasi tutti i linguaggi di programmazione , * è che non è ordinato: gli insiemi {1, 2}e {2, 1}sono lo stesso insieme.


Probabilmente non vuoi davvero ordinare quegli elementi come stringhe, ma come numeri (quindi 4.918560000 verrà prima di 10.277200999 piuttosto che dopo).

La soluzione migliore è molto probabilmente quella di memorizzare i numeri come numeri anziché come stringhe in primo luogo. Ma in caso contrario, devi solo usare una keyfunzione:

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

Per ulteriori informazioni, vedere il Sorting HOWTO nella documentazione ufficiale.


* Vedere i commenti per le eccezioni.


1
@TimothyShields: Hai ragione, avrei dovuto dire "ogni linguaggio di programmazione a cui non piace usare in modo improprio i termini comuni". In una lingua in cui "non modificante" significa "mutante", non sorprende che setsignifichi "elenco ordinato", e devi dire unordered_setche significa "impostato" ...
abarnert

2
Se quel nome è buono o cattivo non è cosa da discutere. L'affermazione che "gli insiemi non sono mai ordinati in nessuna lingua" è falsa.
Timothy Shields

5
Non troverai la parola "non ordinato" sulla pagina di Wikipedia su un insieme matematico. Inoltre non troverai la parola "ordinato". Questo perché è irrilevante per le operazioni matematiche sugli insiemi. Se un particolare linguaggio sceglie di ordinare i set è un dettaglio di implementazione. en.wikipedia.org/wiki/Set_(mathematics)
Timothy Shields

3
@TimothyShields: Nel frattempo, la pagina di wikipedia su Set (matematica) che hai collegato non ha la parola "non ordinato" perché è già ovvia dalla definizione. In particolare, "Gli insiemi A e B sono uguali se e solo se hanno esattamente gli stessi elementi". Non è vero per le raccolte ordinate. (Ci sono anche frasi come: "L'ordine in cui sono elencati gli elementi di un insieme o multinsieme è irrilevante", quindi se avessi cercato in modo leggermente diverso avresti potuto trovarlo anche senza capire il concetto.)
abarnert

3
@TimothyShields: Ma std::set non esporre l'ordinamento (non solo nei modi ovvi tramite l'API, la funzione di ordinamento è in realtà parte del tipo di un dato set). Il fatto che gli elementi siano sempre tenuti ordinati secondo un rigoroso ordine debole fa parte della definizione stessa del concetto. Quindi, il tuo argomento è discutibile. Ma anche se non lo fosse, perché sarebbe importante? Gli insiemi non sono ordinati in quasi tutti i linguaggi di programmazione, proprio come lo sono in matematica. Il fatto che ci sia un linguaggio esterno che usa la parola per significare qualcos'altro non rende questa affermazione meno vera.
abarnert
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.