Learn
← Previous Next →

Hari 25: collections, itertools & functools

60 min Last updated 26 Mar 2026

collections — Struktur Data Tambahan

from collections import Counter, defaultdict, OrderedDict, deque, namedtuple

# Counter — hitung frekuensi elemen
kata = ["apel","mangga","apel","jeruk","mangga","apel"]
c = Counter(kata)
print(c)                    # Counter({'apel': 3, 'mangga': 2, 'jeruk': 1})
print(c.most_common(2))     # [('apel', 3), ('mangga', 2)]
print(c["apel"])            # 3

teks = "hello world"
huruf = Counter(teks.replace(" ",""))
print(huruf.most_common(3)) # 3 huruf terbanyak

# defaultdict — dict dengan nilai default otomatis
dd = defaultdict(list)
dd["a"].append(1)   # tidak perlu cek key dulu
dd["a"].append(2)
dd["b"].append(3)
print(dict(dd))     # {'a': [1, 2], 'b': [3]}

dd_int = defaultdict(int)
for huruf in "programming":
    dd_int[huruf] += 1      # tidak perlu inisialisasi

# deque — double-ended queue, O(1) untuk append/pop kedua ujung
from collections import deque
q = deque([1, 2, 3])
q.appendleft(0)    # tambah di kiri
q.append(4)        # tambah di kanan
q.popleft()        # hapus dari kiri — O(1)
print(q)           # deque([1, 2, 3, 4])

itertools — Iterasi Efisien

import itertools

# chain — gabung banyak iterable
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
print(list(itertools.chain(a, b, c)))  # [1..9]

# product — cartesian product
warna = ["merah", "biru"]
ukuran = ["S", "M", "L"]
for w, u in itertools.product(warna, ukuran):
    print(f"{w}-{u}", end=" ")

# combinations & permutations
tim = ["A", "B", "C", "D"]
print(list(itertools.combinations(tim, 2)))    # C(4,2)=6
print(list(itertools.permutations(tim, 2)))    # P(4,2)=12

# groupby — grup elemen berurutan
from itertools import groupby
data = [("A","Math"),("A","IPA"),("B","Math"),("B","IPS"),("C","IPA")]
data.sort(key=lambda x: x[0])
for kelas, items in groupby(data, key=lambda x: x[0]):
    mapel = [i[1] for i in items]
    print(f"Kelas {kelas}: {mapel}")

functools

from functools import reduce, partial, lru_cache

# reduce — akumulasi
angka = [1, 2, 3, 4, 5]
total = reduce(lambda acc, x: acc + x, angka)
print(total)  # 15

faktorial = reduce(lambda acc, x: acc * x, range(1, 6))
print(faktorial)  # 120

# partial — buat fungsi baru dengan argumen sebagian terikat
def pangkat(base, exp):
    return base ** exp

kuadrat = partial(pangkat, exp=2)
kubik   = partial(pangkat, exp=3)
print(kuadrat(5))  # 25
print(kubik(3))    # 27

# lru_cache — memoization otomatis
@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2: return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(50))  # cepat karena di-cache

Assignment

Analisis teks sebuah paragraf menggunakan Counter dan collections: hitung frekuensi kata, 5 kata terbanyak, dan buat statistik panjang kata (berapa kata 1 huruf, 2 huruf, dst).

Expected output:

Total kata: 40
Kata unik : 33
5 kata terbanyak:
python : 3x ███
yang : 3x ███
pemrograman : 2x ██
dan : 3x ███
data : 2x ██
Distribusi panjang kata:
...
PY main.py
Solution
Output