Menyortir sekumpulan nilai [tertutup]

112

Saya memiliki nilai seperti ini:

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

Saya ingin mengurutkan nilai di masing-masing setdalam urutan yang meningkat. Saya tidak ingin menyortir di antara set, tetapi nilai di setiap set.

Justin Carrey
sumber
3
Apa hubungan tupel dengan masalah tersebut dan apa yang sudah Anda coba?
Fred Foo
3
Saya tidak berpikir set python memiliki konsep pemesanan. Ini mungkin membantu Anda: stackoverflow.com/questions/1653970/…
zallarak
3
satu set tidak teratur. itulah salah satu propertinya. dalam setiap bahasa. gunakan a list.
Karoly Horvath
4
@KarolyHorv "sebuah himpunan tidak teratur. Itu salah satu propertinya. Dalam setiap bahasa." C ++ std::setsudah dipesan.
Timothy Shields
17
Mengapa orang menutup (atau di luar topik) pertanyaan ini setelah fakta? Ya, akan lebih baik jika OP menggambarkan masalahnya daripada menyuruh kita menangkapnya. Tapi sekarang setelah kami melakukannya, dan mengedit pertanyaannya agar cocok, dan dia menerima jawaban, saya tidak melihat bagaimana keputusan mendekati masuk akal.
abarnert

Jawaban:

218

Dari komentar:

Saya ingin menyortir setiap set.

Itu mudah. Untuk set sapa pun (atau apa pun yang dapat diulang), sorted(s)kembalikan daftar elemen sdalam urutan yang diurutkan:

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

Perhatikan bahwa sortedmemberi Anda a list, bukan set. Itu karena inti dari sebuah himpunan, baik dalam matematika dan di hampir setiap bahasa pemrograman , * adalah bahwa ia tidak berurutan: himpunan {1, 2}dan {2, 1}merupakan himpunan yang sama.


Anda mungkin tidak benar-benar ingin mengurutkan elemen tersebut sebagai string, tetapi sebagai angka (jadi 4.918560000 akan muncul sebelum 10.277200999 daripada setelahnya).

Solusi terbaik kemungkinan besar adalah menyimpan angka sebagai angka daripada string. Tetapi jika tidak, Anda hanya perlu menggunakan sebuah keyfungsi:

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

Untuk informasi lebih lanjut, lihat Sorting HOWTO di dokumen resmi.


* Lihat komentar untuk pengecualian.

abarnert
sumber
1
@TimothyShields: Anda benar, saya seharusnya mengatakan "setiap bahasa pemrograman yang tidak suka menyalahgunakan istilah umum". Dalam bahasa di mana "non-modifikasi" berarti "mutasi", tidak mengherankan jika setberarti "daftar yang diurutkan", dan Anda harus mengatakan itu unordered_setberarti "set"…
abarnert
2
Apakah nama itu baik atau buruk bukanlah apa yang akan didiskusikan. Pernyataan bahwa "set tidak pernah diurutkan dalam bahasa apapun" adalah salah.
Timothy Shields
5
Anda tidak akan menemukan kata "tidak berurutan" di halaman Wikipedia tentang kumpulan matematika. Anda juga tidak akan menemukan kata "dipesan". Itu karena tidak relevan dengan operasi matematika pada himpunan. Apakah bahasa tertentu memilih untuk membuat set diurutkan adalah detail implementasi. en.wikipedia.org/wiki/Set_(mathematics)
Timothy Shields
3
@TimothyShields: Sementara itu, halaman wikipedia di Set (matematika) yang Anda tautkan tidak memiliki kata "unordered" karena sudah jelas dari definisinya. Secara khusus, "Set A dan B adalah sama jika dan hanya jika keduanya memiliki elemen yang sama persis". Itu tidak benar untuk koleksi yang dipesan. (Ada juga kalimat seperti: "Urutan di mana elemen suatu himpunan atau multiset didaftarkan tidak relevan", jadi jika Anda hanya mencari sedikit berbeda, Anda dapat menemukannya bahkan tanpa memahami konsepnya.)
abarnert
3
@TimothyShields: Tapi std::set tidak mengekspos pemesanan (bukan hanya dalam cara yang jelas melalui API; fungsi pemesanan sebenarnya bagian dari jenis apapun himpunan). Fakta bahwa elemen-elemen tersebut selalu disimpan dengan urutan yang sangat lemah adalah bagian dari definisi konsep itu sendiri. Jadi, argumen Anda bisa diperdebatkan. Tetapi bahkan jika tidak, mengapa itu penting? Himpunan tidak berurutan di hampir setiap bahasa pemrograman, seperti halnya dalam matematika. Fakta bahwa ada satu bahasa terpencil yang menggunakan kata itu untuk mengartikan sesuatu yang lain tidak membuat pernyataan itu menjadi kurang benar.
abarnert