Pada dasarnya Anda perlu melakukan argsort, implementasi apa yang Anda butuhkan tergantung jika Anda ingin menggunakan perpustakaan eksternal (misalnya NumPy) atau jika Anda ingin tetap murni-Python tanpa dependensi.
Pertanyaan yang perlu Anda tanyakan pada diri sendiri adalah: Apakah Anda menginginkan
- indeks yang akan mengurutkan array / daftar
- mengindeks bahwa elemen akan ada dalam array / daftar yang diurutkan
Sayangnya contoh dalam pertanyaan tidak menjelaskan apa yang diinginkan karena keduanya akan memberikan hasil yang sama:
>>> arr = np.array([1, 2, 3, 100, 5])
>>> np.argsort(np.argsort(arr))
array([0, 1, 2, 4, 3], dtype=int64)
>>> np.argsort(arr)
array([0, 1, 2, 4, 3], dtype=int64)
Memilih argsort implementasinya
Jika Anda memiliki NumPy yang Anda inginkan, Anda cukup menggunakan fungsi numpy.argsortatau metode numpy.ndarray.argsort.
Implementasi tanpa NumPy telah disebutkan dalam beberapa jawaban lain, jadi saya akan rekap solusi tercepat sesuai dengan tolok ukur jawaban di sini
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Mendapatkan indeks yang akan mengurutkan array / daftar
Untuk mendapatkan indeks yang akan mengurutkan array / daftar Anda cukup memanggil argsortarray atau daftar. Saya menggunakan versi NumPy di sini tetapi implementasi Python harus memberikan hasil yang sama
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
Hasilnya berisi indeks yang diperlukan untuk mendapatkan array yang diurutkan.
Karena array yang diurutkan akan menjadi [1, 2, 3, 4]array yang diperdebatkan berisi indeks elemen-elemen ini dalam aslinya.
- Nilai terkecil adalah
1dan berada pada indeks 1dalam dokumen asli sehingga elemen pertama dari hasilnya adalah1 .
- The
2berada pada indeks 2dalam bahasa aslinya sehingga elemen kedua dari hasilnya adalah 2.
- The
3berada pada indeks 0dalam bahasa aslinya sehingga elemen ketiga dari hasilnya adalah 0.
- Nilai terbesar
4dan berada pada indeks 3dalam dokumen asli sehingga elemen terakhir dari hasilnya adalah 3.
Mendapatkan indeks yang akan dimiliki elemen-elemen dalam array / daftar yang diurutkan
Dalam hal ini, Anda perlu menerapkan argsort dua kali :
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
Pada kasus ini :
- elemen pertama dari aslinya adalah
3, yang merupakan nilai terbesar ketiga sehingga akan memiliki indeks 2dalam array / daftar yang diurutkan sehingga elemen pertama adalah2 .
- elemen kedua dari aslinya adalah
1, yang merupakan nilai terkecil sehingga akan memiliki indeks 0dalam array / daftar yang diurutkan sehingga elemen kedua adalah 0.
- elemen ketiga dari aslinya adalah
2, yang merupakan nilai terkecil kedua sehingga akan memiliki indeks 1dalam array yang diurutkan / daftar sehingga elemen ketiga adalah 1.
- elemen keempat dari aslinya adalah
4yang merupakan nilai terbesar sehingga akan memiliki indeks 3dalam array / daftar yang diurutkan sehingga elemen terakhir adalah 3.