Sortowanie zbioru wartości [zamknięte]

112

Mam takie wartoś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'])  

Chcę posortować wartości w setporządku rosnącym. Nie chcę sortować między zestawami, ale wartości w każdym zestawie.

Justin Carrey
źródło
3
Co mają wspólnego krotki z problemem i czego próbowałeś?
Fred Foo,
3
Nie sądzę, aby zestawy Pythona miały koncepcję porządkowania. To może ci pomóc: stackoverflow.com/questions/1653970/ ...
zallarak
3
zestaw jest bez porządku. to jedna z jego właściwości. w każdym języku. użyj list.
Karoly Horvath,
4
@KarolyHorvath "Zestaw jest bezrządny. To jedna z jego właściwości. W każdym języku." C ++ std::setjest uporządkowany.
Timothy Shields
17
Dlaczego ludzie zamknęli (lub nie na temat) to pytanie po fakcie? Tak, byłoby lepiej, gdyby OP opisał swój problem, zamiast zmuszać nas do wyławiania go z niego. Ale teraz, gdy już to zrobiliśmy i dopasowaliśmy jego pytanie, a on zaakceptował odpowiedź, nie rozumiem, jaki sens ma głosowanie za zamknięciem.
abarnert

Odpowiedzi:

218

Z komentarza:

Chcę posortować każdy zestaw.

To łatwe. Dla dowolnego zestawu s(lub czegokolwiek innego iterowalnego) sorted(s)zwraca listę elementów sw posortowanej kolejności:

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

Zauważ, że sorteddaje ci to list, a nie set. Dzieje się tak, ponieważ cały zbiór, zarówno w matematyce , jak iw prawie każdym języku programowania *, polega na tym, że nie jest on uporządkowany: zbiory {1, 2}i {2, 1}są tym samym zestawem.


Prawdopodobnie nie chcesz sortować tych elementów jako ciągów, ale jako liczby (więc 4.918560000 pojawi się przed 10.277200999, a nie po).

Najlepszym rozwiązaniem jest przede wszystkim przechowywanie liczb w postaci liczb, a nie łańcuchów. Ale jeśli nie, wystarczy użyć keyfunkcji:

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

Aby uzyskać więcej informacji, zobacz Sorting HOWTO w oficjalnej dokumentacji.


* Zobacz komentarze dotyczące wyjątków.

abarnert
źródło
1
@TimothyShields: Masz rację, powinienem był powiedzieć „każdy język programowania, który nie lubi nadużywać popularnych terminów”. W języku, w którym „niemodyfikujący” oznacza „mutujący”, nie jest zaskakujące, że setoznacza to „posortowaną listę”, a trzeba powiedzieć, unordered_setże oznacza „ustaw”…
abarnert
2
To, czy to imię jest dobre, czy złe, nie jest przedmiotem dyskusji. Stwierdzenie, że „zbiory nigdy nie są porządkowane w żadnym języku” jest fałszywe.
Timothy Shields
5
Nie znajdziesz słowa „nieuporządkowany” na stronie Wikipedii o zestawie matematycznym. Nie znajdziesz też słowa „zamówione”. To dlatego, że nie ma to znaczenia dla operacji matematycznych na zbiorach. To, czy dany język wybiera uporządkowane zestawy, jest szczegółem implementacji. en.wikipedia.org/wiki/Set_(mathematics)
Timothy Shields
3
@TimothyShields: W międzyczasie strona Wikipedii w Set (matematyka), do której dołączyłeś, nie zawiera słowa „nieuporządkowany”, ponieważ jest to już oczywiste z definicji. W szczególności „Zbiory A i B są równe wtedy i tylko wtedy, gdy mają dokładnie te same elementy”. Nie dotyczy to kolekcji zamówionych. (Są też zdania typu: „Kolejność, w jakiej wyświetlane są elementy zbioru lub multisetu, jest nieistotna”, więc gdybyś szukał trochę inaczej, mógłbyś go znaleźć nawet bez zrozumienia koncepcji.)
abarnert
3
@TimothyShields: Ale std::set nie narażać Zamawianie (nie tylko w oczywistych sposobów poprzez API; funkcja zamawiania jest faktycznie częścią typu w danym zestawie). Fakt, że elementy są zawsze sortowane według ściśle określonej, słabej kolejności, jest częścią samej definicji pojęcia. Więc twój argument jest dyskusyjny. Ale nawet gdyby nie było, dlaczego miałoby to mieć znaczenie? Zestawy są nieuporządkowane w prawie każdym języku programowania, tak jak w matematyce. Fakt, że istnieje jeden odległy język, w którym to słowo oznacza coś innego, nie czyni tego stwierdzenia mniej prawdziwym.
abarnert