Map, Filter, List Komprehensif dan Zip

tutorial python list, 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 baru
  • expression : kode yang digunakan untuk pemrosesan setiap elemen dari existing_list untuk menghasilkan elemen baru
  • condition : 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 zipdigunakan 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]

Selanjutnya : Penanganan Kesalahan (Error Handling)

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Isi