Mengelompokkan barisan nilai

*Sepertinya judul tulisan ini aga2 tidak menjelaskan xD*

Intinya begini. Saya punya sebuah barisan nilai, katakanlah seperti di bawah ini

nilai = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

Nah saya ingin membuat kelompok untuk setiap 2 buah nilai berurutan. Barisan di atas ingin saya ubah menjadi seperti berikut.

pasangan = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12)]

Bagaimana cara cepatnya? Salah satu trik yang saya temukan (di Internet :P) adalah dengan menggunakan fungsi zip dan iter.

Fungsi zip sudah dikenal dapat dipakai untuk menggabungkan dua atau lebih barisan untuk membuat barisan kelompok dari setiap elemen yang ada (err..?). Contohnya

>>> angka = [1, 2, 3]
>>> tulisan = ["satu", "dua", "tiga"]
>>> zip(angka, tulisan)
[(1, 'satu'), (2, 'dua'), (3, 'tiga')]

Nah yang saya mau adalah saya ingin membuat kelompok dari setiap dua elemen berurutan. Untuk ini, fungsi iter dapat kita salahgunakan 😀 Mari kembali ke contoh awal.

>>> nilai = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> iter_nilai = iter(nilai)
>>> zip(iter_nilai, iter_nilai)
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12)]

Hore jadi 😀

Apa yang terjadi di belakang layar? Setelah baca2 source code fungsi zip (Python 2.7.5), setiap barisan yang dimasukkan ke dalam fungsi zip akan dijadikan iterator dan nilainya akan diambil satu persatu sampai salah satu barisan tidak dapat mengeluarkan elemen berikutnya. Andaikan parameter yang dimasukkan sudah berupa iterator, saya asumsikan Python tidak akan membuat iterator baru. Nah berhubung parameter yang dimasukkan berasal dari iterator yang sama, maka nilai akan disebar selang-seling ke kelompok/tuple yang dihasilkan.

Bagaimana cara membuat kelompok dari setiap 3 bilangan berurutan? Tambahkan lagi saja parameter si zip!

>>> nilai = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> iter_nilai = iter(nilai)
>>> zip(iter_nilai, iter_nilai, iter_nilai)
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]

Leave a Reply