Salah satu kelebihan Python untuk keperluan datascience adalah memiliki beberapa jenis struktur data dinamis yang dapat digunakan untuk menyimpan beberapa data sekaligus dalam sebuah variabel. Beberapa di antaranya adalah: List, Array, Set, Tuple, Dictionary, dan Dataframe. Masing-masing jenis struktur data memiliki karakteristik yang berbeda.
Artikel ini khusus akan membahas bagaimana melakukan sorting data list berbentuk multidimensi di Python, yang akan dipadu dengan teknik pembacaan data dari sebuah file.
Karakteristik List di Python
Sebagai sebuah struktur data dinamis, list memiliki beberapa karakteristik yaitu:
- Bersifat mutable: struktur datanya bisa diubah (ditambah, dihapus, disort, disisipkan)
- Untuk akses data dalam list menggunakan sistem indexing yang dimulai dari 0, 1, 2, dst
- Data yang disimpan dalam list tidak harus bertipe data sama
- Elemen data dalam sebuah list dapat berupa list juga
Jika sebuah list berisi data berupa list juga, maka akibatnya akan terbentuk sebuah list multidimensi seperti contoh berikut ini.
myList = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Contoh di atas akan terbentuk sebuah list dengan dimensi 3×3, yang terdiri dari 3 baris dan 3 kolom.
Misalkan kita memiliki sebuah list multidimensi berukuran mxn, bagaimana cara melakukan sorting berdasarkan key dari kolom tertentu? Sebagai contoh misalkan kita memiliki sebuah list berisi serangkaian data NIM, Nama Mhs, dan Nilai sbb:
data = [["M01", "Mr. A", 78], ["M02", "Mr. B", 89 ], ["M03", "Mr. C", 57]]
Bagaimana cara kita melakukan sorting list data tersebut berdasarkan nilai mahasiswanya secara ascending atau descending? Hal ini yang akan kita bahas pada artikel ini.
Problem Statement
Untuk menjawab permasalahan di atas, kita akan mencoba mengimplementasikannya dalam sebuah studi kasus. Misalkan kita memiliki sebuah file (mydata.txt) yang tersimpan di direktori D:\ berisi data sbb:
K3512301#Mr. X#80
K3512302#Mr. Y#50
K3512303#Mr. Z#65
Selanjutnya kita ingin membuat program Python untuk membaca semua data dari file tersebut, dan menampilkan outputnya dalam bentuk data yang telah terurut (sorted) secara descending berdasarkan nilainya. Sehingga harapannya akan muncul tampilan berikut ini.
NIM: K3512301 , Name: Mr. X , Grade: 80
NIM: K3512303 , Name: Mr. Z , Grade: 65
NIM: K3512302 , Name: Mr. Y , Grade: 50
Solusi Permasalahan
Untuk membuat program penyelesaian masalah di atas, kita mulai dari proses membuka file mydata.txt nya terlebih dahulu dengan function open() dengan mode read (r). Oya supaya tidak lupa, sekalian ditambah perintah untuk menutup filenya dengan close().
# membuka file dengan mode read (r)
myFile = open("d:\data.txt", "r")
# menutup file
myFile.close()
Langkah berikutnya adalah membaca semua isi file dengan teknik pembacaan secara baris per baris menggunakan method readlines().
# membuka file dengan mode read (r)
myFile = open("d:\data.txt", "r")
# membaca isi file baris perbaris
dataAll = myFile.readlines()
# menutup file
myFile.close()
Apabila dataAll ini diberikan perintah print(dataAll) maka akan diperoleh sebuah list berisi data perbaris file, yaitu:
['K3512301#Mr. X#80\n', 'K3512302#Mr. Y#50\n', 'K3512303#Mr. Z#65\n']
Perhatikan di dalam listnya! Pada data nilai akan terdapat tambahan karakter newline \n. Karakter ini nantinya akan kita hapus dengan teknik tertentu. Dengan demikian kita dapatkan sebuah list dengan 3 buah data di dalamnya, sesuai dengan banyaknya baris dalam file.
Langkah berikutnya adalah memecah setiap data yang ada dalam list untuk mendapatkan NIM, Nama, dan Nilai masing-masing. Sebagai contoh untuk data 'K3512301#Mr. X#80\n' kita akan ambil NIM nya yaitu 'K3512301', nama mahasiswanya 'Mr. X', dan nilainya 80. Proses ini akan dilakukan berulang-ulang untuk setiap data. Sehingga ini nanti akan dilakukan dengan sebuah looping. Namun sebelum kita melakukan hal tersebut, terlebih dahulu kita siapkan sebuah list (empty list), misalkan kita beri nama myData, untuk menyimpan hasil pecahan data tersebut.
# membuka file dengan mode read (r)
myFile = open("d:\data.txt", "r")
# membaca isi file baris perbaris
dataAll = myFile.readlines()
# inisialisasi data list
myData = []
# menutup file
myFile.close()
OK sekarang kita akan membuat kode untuk memecah data (data splitting) untuk mendapatkan NIM, Nama, dan Nilai kemudian hasil pecahannya akan kita tambahkan ke dalam list myData. Untuk memecah data guna mendapatkan data NIM, Nama, dan Nilai kita bisa menggunakan method split('#').
Oya untuk menghilangkan tanda \n yang ada di data nilai bagaimana? kita bisa menghilangkannya dengan method replace("\n", "") yaitu mengganti tanda \n dengan blank character. Setelah tanda \n ini dihilangkan, sebaiknya data nilai kita convert ke dalam tipe data integer menggunakan int() supaya nantinya bisa digunakan sebagai acuan proses sortingnya. Konversi ke integer ini perlu dilakukan karena data nilai ini masih bertipe data string.
Selanjutnya misalkan data NIM, Nama, dan Nilai sudah diperoleh dari proses pemecahan data (data splitting), langkah berikutnya adalah menambahkan data ini ke dalam list myData menggunakan method append(). Namun ketiga data tersebut harus dikonstruksi ke dalam list dulu untuk memudahkan proses sorting. Hal ini bisa dilakukan dengan memberikan perintah append([nim, nama, nilai]).
# membuka file dengan mode read (r)
myFile = open("d:\data.txt", "r")
# membaca isi file baris perbaris
dataAll = myFile.readlines()
# inisialisasi data list
myData = []
# untuk setiap data pada dataAll lakukan...
for data in dataAll:
# menghapus \n
data = data.replace("\n", "")
# memecah data berdasarkan tanda #
splitData = data.split("#")
# menambahkan data hasil pecahan ke dalam list myData, dengan
# splitData[0] adalah data nim
# splitData[1] adalah data nama
# splitData[2] adalah data nilai
myData.append([splitData[0], splitData[1], int(splitData[2])])
# menutup file
myFile.close()
Dari program di atas, apabila myData ditampilkan datanya dengan print(myData) maka akan diperoleh struktur list multidimensi berukuran 3×3 sebagai berikut
[['K3512301', 'Mr. X', 80], ['K3512302', 'Mr. Y', 50], ['K3512303', 'Mr. Z', 65]]
Langkah terakhir adalah kita akan melakukan sorting myData berdasarkan nilainya secara descending. Dalam hal ini posisi data nilai ada di index ke-2 dari setiap data listnya. Untuk melakukan sorting descending berdasarkan data index ke-2 kita bisa gunakan perintah sort(key=itemgetter(2), reverse=True). Namun untuk bisa menggunakan perintah itemgetter() terlebih dahulu kita harus mengimportnya dengan perintah: import library from operator import itemgetter.
#import library
from operator import itemgetter
# membuka file dengan mode read (r)
myFile = open("d:\data.txt", "r")
# membaca isi file baris perbaris
dataAll = myFile.readlines()
# inisialisasi data list
myData = []
# untuk setiap data pada dataAll lakukan...
for data in dataAll:
# menghapus \n
data = data.replace("\n", "")
# memecah data berdasarkan tanda #
splitData = data.split("#")
# menambahkan data hasil pecahan ke dalam list myData, dengan
# splitData[0] adalah data nim
# splitData[1] adalah data nama
# splitData[2] adalah data nilai
myData.append([splitData[0], splitData[1], int(splitData[2])])
# sorting data ascending berdasarkan nilai (index ke-2)
myData.sort(key=itemgetter(2), reverse=True)
# menutup file
myFile.close()
Setelah selesai melakukan sorting descending berdasarkan nilai, selanjutnya kita bisa tampilkan data myData nya.
#import library
from operator import itemgetter
# membuka file dengan mode read (r)
myFile = open("d:\data.txt", "r")
# membaca isi file baris perbaris
dataAll = myFile.readlines()
# inisialisasi data list
myData = []
# untuk setiap data pada dataAll lakukan...
for data in dataAll:
# menghapus \n
data = data.replace("\n", "")
# memecah data berdasarkan tanda #
splitData = data.split("#")
# menambahkan data hasil pecahan ke dalam list myData, dengan
# splitData[0] adalah data nim
# splitData[1] adalah data nama
# splitData[2] adalah data nilai
myData.append([splitData[0], splitData[1], int(splitData[2])])
# sorting data ascending berdasarkan nilai (index ke-2)
myData.sort(key=itemgetter(2), reverse=True)
# print output myData
for data in myData:
print("NIM:",data[0],", Name:", data[1],", Grade:",data[2])
# menutup file
myFile.close()
OK itu dia ide penyelesaian dan implementasi kode program Python untuk masalah yang diberikan. Mudah bukan membuatnya? Dengan menggunakan perintah sort() kita bisa melakukan sorting multidimensi di Python, namun terlebih dahulu kita tentukan key yaitu index mana yang akan dijadikan acuan sortingnya menggunakan itemgetter().

