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.argsort
atau 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 argsort
array 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
1
dan berada pada indeks 1
dalam dokumen asli sehingga elemen pertama dari hasilnya adalah1
.
- The
2
berada pada indeks 2
dalam bahasa aslinya sehingga elemen kedua dari hasilnya adalah 2
.
- The
3
berada pada indeks 0
dalam bahasa aslinya sehingga elemen ketiga dari hasilnya adalah 0
.
- Nilai terbesar
4
dan berada pada indeks 3
dalam 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 2
dalam array / daftar yang diurutkan sehingga elemen pertama adalah2
.
- elemen kedua dari aslinya adalah
1
, yang merupakan nilai terkecil sehingga akan memiliki indeks 0
dalam array / daftar yang diurutkan sehingga elemen kedua adalah 0
.
- elemen ketiga dari aslinya adalah
2
, yang merupakan nilai terkecil kedua sehingga akan memiliki indeks 1
dalam array yang diurutkan / daftar sehingga elemen ketiga adalah 1
.
- elemen keempat dari aslinya adalah
4
yang merupakan nilai terbesar sehingga akan memiliki indeks 3
dalam array / daftar yang diurutkan sehingga elemen terakhir adalah 3
.