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-cacheAssignment
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