Map, Filter, List Komprehensif dan Zip
[versi python yang digunakan pada tutorial ini adalah 3.11
]
Map
Map adalah fungsi python yang digunakan untuk memetakan fungsi tertentu dan menerapkannya pada setiap elemen dalam satu atau lebih objek iterable. Hasil pemetaan tersebut akan mengembalikan objek iterable baru sesuai fungsi yang digunakan. Fungsi map
memungkinkan kita untuk melakukan operasi yang sama pada setiap elemen tanpa perlu menulis loop secara eksplisit. Pemetaan ini berarti mengambil setiap elemen dari iterable dan mengolahnya melalui fungsi yang diberikan dan menghasilkan nilai baru.
Argumen pertama fungsi map
adalah fungsi yang akan diterapkan baik berupa fungsi biasa maupun fungsi lambda. Argumen kedua dan seterusnya adalah objek iterable yang akan dipetakan. Fungsi map
akan diterapkan pada setiap elemen secara berurutan, menghasilkan nilai baru, dan dikembalikan lagi dalam bentuk iterable baru. Jika ingin mendapatkan hasil dalam bentuk list, maka dapat dikonversi menggunakan fungsi list
.
CONTOH 1. Membuat List Nilai Kuadrat dari List Angka
Misalkan terdapat list dengan elemen 1
, 2
sampai 5
. Dengan menggunakan fungsi map
, kita dapat membuat list baru berisi nilai kuadrat dari elemen-elemen tersebut tanpa harus melakukan iterasi. Implementasi pada kode di bawah ini juga menyertakan perbandingan penggunaan iterasi dan map
untuk memperoleh hasil yang sama. Dapat dilihat bahwa fungsi map
menggunakan sintaks yanglebih sederhana dibandingkan iterasi.
Kode
list_angka = [1, 2, 3, 4, 5] # dengan iterasi list_kuadrat_iter = [] for x in list_angka: list_kuadrat_iter.append(x**2) print(list_kuadrat_iter) # dengan map list_kuadrat_map = list(map(lambda x: x**2, list_angka)) print(list_kuadrat_map)
# OUTPUT [1, 4, 9, 16, 25] [1, 4, 9, 16, 25]
CONTOH 2. Menghitung Proporsi Nilai dalam List
Pada sintaks python di bawah ini, terdapat list berisi nilai-nilai tertentu. Misal ingin dihitung proporsi masing-masing nilai terhadap totalnya. Dalam hal ini, fungsi map
dapat digunakan dengan mudah untuk memproses list tersebut.
Kode
list_nilai = [40, 70, 30, 50] tot = sum(list_nilai) # dengan iterasi list_prop_iter = [] for x in list_nilai: list_prop_iter.append(round(x / tot, 2)) print(list_prop_iter) # map list_prop_map = list(map(lambda x: round(x / tot, 2), list_nilai)) print(list_prop_map)
# OUTPUT [0.21, 0.37, 0.16, 0.26] [0.21, 0.37, 0.16, 0.26]
CONTOH 3. Menentukan Status Hasil Ujian dari List Nilai
Pada contoh berikut, terdapat list yang berisi nilai-nilai dengan besaran bervariasi. Misalkan nilai ini adalah hasil ujian dengan prasyarat kategori lulus jika nilai lebih dari 60. Menggunakan fungsi map
, dapat dibuat list yang berisi status "LULUS"
atau "GAGAL"
berdasarkan list nilai tersebut. Seperti sebelumnya, sintaks menggunakan iterasi juga ditampilkan sebagai perbandingan.
Kode
list_nilai = [70, 85, 40, 80, 45, 90, 50] # dengan iterasi list_status_iter = [] for x in list_nilai: if x > 60: list_status_iter.append("LULUS") else: list_status_iter.append("GAGAL") print(list_status_iter) # dengan map list_status_map = list(map(lambda x: "LULUS" if x > 60 else "GAGAL", list_nilai)) print(list_status_map)
# OUTPUT ['LULUS', 'LULUS', 'GAGAL', 'LULUS', 'GAGAL', 'LULUS', 'GAGAL'] ['LULUS', 'LULUS', 'GAGAL', 'LULUS', 'GAGAL', 'LULUS', 'GAGAL']
CONTOH 4. Mengekstrak Nilai Tertentu dari List Dictionary
Tidak hanya berlaku untuk elemen numerik. Fungsi map juga dapat diterapkan pada iterable dengan elemen tipe apapun. Misalkan terdapat list dengan elemen berupa dictionary. Kita akan mengekstrak satu atau beberapa key dalam dictionary tersebut dan menyimpannya dalam list baru. Pada contoh list pokemnon berikut, akan diambil nilai dari key name
saja untuk setiap elemennya.
Kode
list_pokemon = [ {"name": "Pikachu", "type": "Electric", "hp": 35}, {"name": "Bulbasaur", "type": "Grass", "hp": 45}, {"name": "Charmander", "type": "Fire", "hp": 39}, {"name": "Squirtle", "type": "Water", "hp": 44}, {"name": "Snorlax", "type": "Normal", "hp": 160}, ] # dengan iterasi list_name_iter = [] for pokemon in list_pokemon: list_name_iter.append(pokemon["name"]) print(list_name_iter) # dengan map list_name_map = list(map(lambda x: x["name"], list_pokemon)) print(list_name_map)
# OUTPUT ['Pikachu', 'Bulbasaur', 'Charmander', 'Squirtle', 'Snorlax'] ['Pikachu', 'Bulbasaur', 'Charmander', 'Squirtle', 'Snorlax']
Filter
Fungsi filter
digunakan untuk menyeleksi elemen-elemen dalam suatu iterable berdasarkan kriteria tertentu. Sama Filter menerima dua argumen: argumen pertama yaitu fungsi yang berisi kriteria filter dan argumen kedua adalah iterable yang akan difilter. Argumen fungsi yang diberikan akan memproses apakah suatu elemen disertakan dalam hasil filtrasi atau tidak.
Fungsi filter
akan mengembalikan iterable dengan isian berupa elemen-elemen yang memenuhi kriteria filter. Hasil filter
dapat dikonversi ke dalam bentuk list menggunakan fungsi list
.
Berikut ini adalah beberapa contoh penerapan fungsi filter
:
CONTOH 5. Filter Elemen dengan Batas Nilai Tertentu
Pada contoh ini, terdapat objek list list_nilai
dengan sekumpulan elemen berupa bilangan integer. Dengan menggunakan fungsi filter
, kita dapat menyeleksi elemen-elemen yang memiliki nilai > 60 tanpa perlu melakukan iterasi. Pada sintaks di bawah ini ditampilkan pula penggunaan iterasi untuk menghasilkan output yang sama. Dapat dilihat bahwa fungsi filter
memiliki sintaks yang lebih sederhana dibandingkan iterasi.
Kode
list_nilai = [70, 85, 40, 80, 45, 90, 50] # cara iterasi list_lulus_iter = [] for x in list_nilai: if x > 60: list_lulus_iter.append(x) print(list_lulus_iter) # cara filter list_lulus_filt = list(filter(lambda x: x > 60, list_nilai)) print(list_lulus_filt)
# OUTPUT [70, 85, 80, 90] [70, 85, 80, 90]
CONTOH 6. Filter List Dictionary dengan Key Tertentu
Pada contoh di bawah ini, terdapat objek list list_pokemon
yang berisi elemen berupa dictionary. Dengan menggunakan fungsi filter
kita dapat menyeleksi elemen-elemen berdasarkan key tertentu. Pada kode di bawah ini akan dibuat list baru yang berisi pokemon dengan nilai hp
< 40
.
Kode
list_pokemon = [ {"name": "Pikachu", "type": "Electric", "hp": 35}, {"name": "Bulbasaur", "type": "Grass", "hp": 45}, {"name": "Charmander", "type": "Fire", "hp": 39}, {"name": "Squirtle", "type": "Water", "hp": 44}, {"name": "Snorlax", "type": "Normal", "hp": 160}, ] # ekstract nilai untuk key name saja dengan HP < 40 # cara iterasi low_hp_iter = [] for poke in list_pokemon: if poke["hp"] < 40: low_hp_iter.append(poke) print(low_hp_iter) # filter low_hp_filt = list(filter(lambda poke: poke["hp"] < 40, list_pokemon)) print(low_hp_filt)
# OUTPUT [{'name': 'Pikachu', 'type': 'Electric', 'hp': 35}, {'name': 'Charmander', 'type': 'Fire', 'hp': 39}] [{'name': 'Pikachu', 'type': 'Electric', 'hp': 35}, {'name': 'Charmander', 'type': 'Fire', 'hp': 39}]
List Komprehensif
List komprehensif adalah fitur pada bahasa python yang memungkinkan membuat kode dengan ringkas dan efisien untuk membuat list baru melalui sintaks yang mudah dibaca. Proses di dalam list komprehensif adalah menggabungkan elemen-elemen dari list yang ada, melakukan operasi pada setiap elemen, dan memfilter elemen sesuai dengan kondisi tertentu.
Terdapat 3 bagian utama pada list komprehensif yaitu:
existing_list
: list asal yang akan digunakan dalam proses pembentukan list baruexpression
: kode yang digunakan untuk pemrosesan setiap elemen dariexisting_list
untuk menghasilkan elemen barucondition
: kondisi dapat ditetapkan untuk menyeleksi elemen dari existing_list yang sesuai kriteria tertentu saja
Ringkasnya, list komprehensif memiliki fungsi yang mirip dengan map
, filter
dan bahkan dapat digunakan sebagai kombinasi keduanya dengan sintaks yang lebih sederhana lagi.
Kode
new_list = [expression for item in existing_list if condition]
CONTOH 1 – 4. Map vs List Komprehensif
Kode-kode dari contoh 1-4 pada bagian fungsi map
dapat kita tulis dalam bentuk list komprehensif. Dapat dilihat bahwa penggunaan list komprehensif membuat sintaks menjadi lebih sederhana lagi.
Kode
# CONTOH 1 list_angka = [1, 2, 3, 4, 5] # map list_kuadrat_map = list(map(lambda x: x**2, list_angka)) print(list_kuadrat_map) # list komprehensif list_kuadrat_komp = [x**2 for x in list_angka] print(list_kuadrat_komp) # CONTOH 2 list_nilai = [40, 70, 30, 50] tot = sum(list_nilai) # map list_prop_map = list(map(lambda x: round(x / tot, 2), list_nilai)) print(list_prop_map) # list komprehensif list_prop_komp = [round(x / tot, 2) for x in list_nilai] print(list_prop_komp) # CONTOH 3 list_nilai = [70, 85, 40, 80, 45, 90, 50] # map list_status_map = list(map(lambda x: "LULUS" if x > 60 else "GAGAL", list_nilai)) print(list_status_map) # list komprehensif list_status_komp = ["LULUS" if x > 60 else "GAGAL" for x in list_nilai] print(list_status_komp) # CONTOH 4 list_pokemon = [ {"name": "Pikachu", "type": "Electric", "hp": 35}, {"name": "Bulbasaur", "type": "Grass", "hp": 45}, {"name": "Charmander", "type": "Fire", "hp": 39}, {"name": "Squirtle", "type": "Water", "hp": 44}, {"name": "Snorlax", "type": "Normal", "hp": 160}, ] # map list_name_map = list(map(lambda poke: poke["name"], list_pokemon)) print(list_name_map) # list komprehensif list_name_komp = [poke["name"] for poke in list_pokemon] print(list_name_komp)
# OUTPUT [1, 4, 9, 16, 25] [1, 4, 9, 16, 25] [0.21, 0.37, 0.16, 0.26] [0.21, 0.37, 0.16, 0.26] ['LULUS', 'LULUS', 'GAGAL', 'LULUS', 'GAGAL', 'LULUS', 'GAGAL'] ['LULUS', 'LULUS', 'GAGAL', 'LULUS', 'GAGAL', 'LULUS', 'GAGAL'] ['Pikachu', 'Bulbasaur', 'Charmander', 'Squirtle', 'Snorlax'] ['Pikachu', 'Bulbasaur', 'Charmander', 'Squirtle', 'Snorlax']
CONTOH 5-6. Filter vs List Komprehensif
List komprehensif juga dapat digunakan untuk menggantikan fungsi filter
. Dengan menambahkan kondisi tertentu pada akhir sintaks (misal pada contoh ini ; if x > 60
), maka list komprehensif akan mengambil elemen-elemen yang memenuhi kondisi tersebut saja.
Kode
# CONTOH 5 list_nilai = [70, 85, 40, 80, 45, 90, 50] # filter lulus_filt = list(filter(lambda x: x > 60, list_nilai)) print(lulus_filt) # list komprehensif lulus_comp = [x for x in list_nilai if x > 60] print(lulus_comp) # CONTOH 6 list_pokemon = [ {"name": "Pikachu", "type": "Electric", "hp": 35}, {"name": "Bulbasaur", "type": "Grass", "hp": 45}, {"name": "Charmander", "type": "Fire", "hp": 39}, {"name": "Squirtle", "type": "Water", "hp": 44}, {"name": "Snorlax", "type": "Normal", "hp": 160}, ] # filter low_hp_filt = list(filter(lambda poke : poke["hp"] < 40, list_pokemon)) print(low_hp_filt) # list komprehensif low_hp_komp = [poke for poke in list_pokemon if poke["hp"] < 40] print(low_hp_komp)
# OUTPUT [70, 85, 80, 90] [70, 85, 80, 90] [{'name': 'Pikachu', 'type': 'Electric', 'hp': 35}, {'name': 'Charmander', 'type': 'Fire', 'hp': 39}] [{'name': 'Pikachu', 'type': 'Electric', 'hp': 35}, {'name': 'Charmander', 'type': 'Fire', 'hp': 39}]
Melewatkan Fungsi yang Lebih Kompleks
Fungsi map
, filter
ataupun list komprehensif tidak hanya dapat menangani operasi sederhana atau dalam fungsi lambda saja. Jika kondisi yang diperlukan lebih kompleks, maka dapat dibuat dalam bentuk fungsi biasa (menggunakan def
).
Pada fungsi map
dan filter
, argumen yang dikirimkan adalah nama fungsinya (bukan pemanggilannya), misal pada contoh berikut, yang menjadi argumen fungsi map
adalah get_grade
(bukan get_grade(nilai_filter)
). Sementara itu pada list komprehensif, yang menjadi ekspresi adalah hasil pemanggilan fungsi tersebut, yaitu get_grade(list_nilai)
.
Pada contoh ini juga dapat terlihat penggunaan list komprehensif untuk memfilter sekaligus memodifikasi nilai elemen list untuk mendapatkan list baru. Output yang dihasilkan akan mengeliminasi nilai elemen yang kurang dari sama dengan nol dan memetakan nilai tersebut menjadi grade A
, B
, C
atau D
.
Kode
list_nilai = [70, 85, 40, 80, 45, 0, 90, 50, 0] def get_grade(nilai): if nilai > 80: return "A" elif nilai > 70: return "B" elif nilai > 50: return "C" else: return "D" # filter dan map nilai_filter = list(filter(lambda x: x > 0, list_nilai)) grade_map = list(map(get_grade, nilai_filter)) print(grade_map) # list komprehensif grade_komp = [get_grade(x) for x in list_nilai if x > 0] print(grade_komp)
# OUTPUT ['C', 'A', 'D', 'B', 'D', 'A', 'D'] ['C', 'A', 'D', 'B', 'D', 'A', 'D']
Zip
Fungsi zip
digunakan untuk menggabungkan elemen-elemen dari satu atau lebih iterable menjadi satu set tuple yang berpasangan. Penggabungan ini memungkinkan kita untuk melakukan operasi secara berpasangan antara elemen pada posisi yang sama di masing-masing list. Fungsi ini dapat menampung dua atau lebih iterable sekaligus. Jika jumlah elemen pada setiap iterable berbeda, maka fungsi zip
akan selesai mengikuti iterable dengan jumlah elemen paling sedikit.
Kode
nilai_teori = [60, 90, 85, 75, 80] nilai_praktik = [80, 85, 70, 80, 70] nilai_bonus = [90, 95, 85, 80, 85] # membuat list dengan rata-rata terboboti 0.6*teori + 0.4*praktek # zip + iterasi nilai_terbobot_iter = [] for teori, praktik in zip(nilai_teori, nilai_praktik): nilai = 0.6*teori + 0.4*praktik nilai_terbobot_iter.append(nilai) print(nilai_terbobot_iter) # zip + map nilai_terbobot_map = list( map( lambda nilai: 0.6*nilai[0] + 0.4*nilai[1], zip(nilai_teori, nilai_praktik), ) ) print(nilai_terbobot_map) # zip + list komprehensif nilai_terbobot_komp = [ 0.6*t + 0.4*p for t, p in zip(nilai_teori, nilai_praktik) ] print(nilai_terbobot_komp) print("") # membandingkan nilai teori vs praktik mana yang lebih besar print(f"Nilai Teori : {nilai_teori}") print(f"Nilai Praktik : {nilai_praktik}") # zip + map cek_lebih_tinggi = list( map( lambda nilai: "T" if nilai[0] > nilai[1] else "P", zip(nilai_teori, nilai_praktik), ) ) print(f"Yang lebih tinggi : {cek_lebih_tinggi}")
# OUTPUT [68.0, 88.0, 79.0, 77.0, 76.0] [68.0, 88.0, 79.0, 77.0, 76.0] [68.0, 88.0, 79.0, 77.0, 76.0] Nilai Teori : [60, 90, 85, 75, 80] Nilai Praktik : [80, 85, 70, 80, 70] Yang lebih tinggi : ['P', 'T', 'T', 'P', 'T']
Fungsi zip
dapat menggabungkan lebih dari dua iterable sekaligus. Berikut adalah contoh penggunaan fungsi zip
pada 3 list untuk menghitung nilai rata-rata berdasarkan nilai dari tiga list tersebut.
Kode
# zipping 3 buah list nilai_teori = [60, 90, 85, 75, 80] nilai_praktik = [80, 85, 70, 80, 70] nilai_bonus = [85, 95, 85, 85, 90] nilai_rataan = list( map( lambda nilai: sum(nilai) / 3, zip(nilai_teori, nilai_praktik, nilai_bonus), ) ) print(nilai_rataan)
# OUTPUT [75.0, 90.0, 80.0, 80.0, 80.0]
Dasar-Dasar Pemrograman dengan Python
Selanjutnya : Penanganan Kesalahan (Error Handling)