Tips dan Trik: List dan Tuple dalam Python

Lists dan tuples singkatnya bisa dilihat sebagai “arrays”(di Python masuk kedalam class data structure yang disebut collection) yang mana bertindak sebagai data kontainer untuk tipe data apapun yang dimiliki oleh Python objects.

Items pada keduanya pun diurutkan dan diakses melalui index offset, sama seperti array, hanya saja list dan tuple dapat menyimpan jenis data yang lebih beragam(bila kita ingat pembahasan tentang array pada materi linear algebra, array itu hanya menyimpan data angka(int, float)).

Pemahaman bagaimana Python bekerja dengan collection datatype seperti list dan tuple, akan membantu kita dalam membuat kodingan yang lebih efisien. Kali ini kita akan kupas tuntas mengenai datatype tersebut, beserta daftar link-link yang bermanfaatnya lainnya.

Suatu array itu secara sederhana bisa kita lihat sebagai suatu flat list of data dengan intrinsic ordering. Prior knowledge dari ordering dalam array itu cukup penting, karena dengan mengetahui posisi suatu data dalam array, kita dapat memanggil nilai dari data tersebut cukup dengan satu proses pencarian sederhana (0[1]).

Batasan lain yang perlu kita ketahui, adalah perbedaan antara list dan tuple: list itu berupa dynamic array, sedangkan tuple adalah static array.

System memory pada komputer bisa dilihat seperti "a series of numbered buckets", dimana setiap bucket dapat menyimpan sebuah angka. Angka-angka ini dapat digunakan untuk merepresentasikan segala jenis variable yang kita inginkan(integer, float, string atau lainya), karena pada dasarnya bucket akan merujuk letak data dalam memory.

Ketika kita ingin membuat sebuah array(entah itu list ataupun tuple), pertama kali kita butuh untuk mengalokasikan sebuah block pada system memory(dimana setiap section pada block ini akan digunakan sebagai integersized pointer pada actual data). Proses tersebut juga melibatkan kernel proses, operating system subproses, dan request untuk penggunaan berturut-turut dari N  bucket.

Gambar dibawah akan menunjukkan contoh layout untuk suatu array(pada kasus ini adalah sebuah list)dengan ukuran 6 pada system memory. Ingat dalam Python, list juga menyimpan informasi seberapa besar ia, karena itu dari 6 block yang dialokasikan, hanya 5 block awal yang dapat digunakan:

Contoh dari layout system pada memory untuk array berukuran 6

Contoh dari layout system pada memory untuk array berukuran 6

Jadi ketika kita ingin melakukan operasi pencarian untuk data tertentu dalam sebuah list, kita hanya butuh untuk mengetahui nilai dari data apa yang kita ingin cari dan mengingat pada bucket apa data itu dimulai. Semenjak semua data akan menempati jumlah space yang sama(satu bucket, atau lebih spesifiknya, satu integersized pointer pada actual data), karena itu kita tidak perlu untuk mengetahui seluruh jenis data yang disimpan untuk menjalankan operasi ini.

Seperti halnya string, list juga memberikan sequential storage dengan offset index dan cara akses pada satu atau lebih elementnnya dengan menggunakan slices.

Yang saya tau perbandingan antara keduanya(list dan string) tidak lebih dari itu. String data kontainer hanya berupa karakter dan bersifat immutable, sementara itu data kontainter pada list lebih fleksibel karena dapat menyimpan segala Python object.

Karena tipe kontainer dari list yang bersifat mutable, list bisa dibilang jadi pilihan yang tepat untuk membuat berbagai tipe data structure. Dua operasi data struktur yang umum jika kita berbicara tentang list yaitu stack and queue.

Kenapa list dalam Python dapat menyimpan segala bentuk objek Python? karena list itu sebetulnya hanya menyimpan pointer dimana data itu disimpan, bukan menyimpan data itu sendiri.


Karena pembahasan ini cukup panjang, maka akan ane bagi menjadi beberapa section:

  1. Definition

    Penjelasan singkat mengenai hal-hal terkait yang perlu kita ketahui mengenai data collection pada Python khususnya dan pada pemrograman pada umumnya.

    Terdiri dari: Mutable dan Unmutable, Hashable dan Unhashable, list vs tuple

  2. Creation

    Sub mengenai bagaimana cara mendefinisikan list dan tuple

    Terdiri dari: Create, Adding, Join, Removing

  3. Manipulation

    Sub mengenai teknik-teknik yang terlibat dalam list dan tuple operation, seperti (Read,Update,Delete,Merge,Sort,Search)

    Terdiri dari: Slicing, Sorting, List Comprehension, Update, Searching, Find Index, Komparasi dua List, Filtering, Intersection

  4. Optimization and Collaboration

    Sub mengenai teknik-teknik optimisasi dan hal-hal berguna lainnya pada list dan tuple

    Terdiri dari: Named Tuple, Array, Stack-Queue dan Deque, Range dan XRange, Itertools, Other Optimization


Definition

  1. Apa itu Mutable dan Unmutable
    codehabitude
    stackoverflow-1
    stackoverflow-2
    stackoverflow-3
    

    Proses klasifikasi suatu objek kedalam immutable dan mutable saya rasa perlu untuk dipahami. Pada awalnya konsep ini mungkin akan sedikit membingungkan.

    Berikut detailnya mengenai immutable dan mutable type:

    • Immutables (numbers, strings, tuples, frozensets)

      Jika suatu objek digolongkan kedalam immutable, diartikan kita tidak dapat merubah nilai objek tersebut seketika(objek sudah diberi nilai awal). Karena itu kita harus membuat objek baru untuk menyimpan nilai baru tersebut.

      Atau mungkin lebih tepatnya, kita tidak bisa merubah nilai dari immutable objek seketika, akan tetapi kita dapat memberikan nilai baru untuk immutable objek dengan slicing, concatenation dan beberapa lainnya(proses ini akan membuat suatu objek baru).

      Dapat diartikan juga, nilai suatu Immutable object tidak akan berubah dengan cara apapun selama masa hidup suatu aplikasi.

    • Mutables (lists, dictionaries, sets, bytearray)

      Sebaliknya dari Immutable, Mutable object selalu dapat dirubah nilainya seketika, dan tidak perlu untuk membuat suatu objek baru.

      Yang perlu diingat juga, proses replikasi tetap dapat dilakukan pada Immutable dan Mutable types.

    Umumnya, konsep dari immutable yang menjamin nilai dari suatu object tidak akan berubah, dapat memberikan keuntungan tersendiri.

    Immutable objects sangat berguna pada aplikasi multi-threaded. Proses dalam Multi-threads juga dapat menangani data yang direpresentasikan oleh immutable objek dan tanpa perlu khawatir kalau data tersebut akan dirubah oleh thread lainnya. Karena itu immutable object bisa dibilang lebih thread-safe dibanding mutable objek.

  2. Hashable dan Unhashable
    stackoverflow-1
    stackoverflow-2
    stackoverflow-3
    stackoverflow-4
    stackoverflow-5
    stackoverflow-6
    stackoverflow-7
    
    • Hashable

      Sebuah objek disebut hashable jika object tersebut memiliki hash value yang tidak pernah berubah selama siklus hidupnya (objek tersebut membutuhkan __hash__() method), dan dapat dibandingkan dengan object lainnya (membutuhkan __eq__() atau __cmp__() method).

      Sebuah hashable object yang sama harus memiliki hash value yang sama pula.

      Hashability membuat suatu object berguna seperti dictionary key dan set karena data structur seperti itu menggunakan hash value secara internal.

      Seluruh immutable built-in object dalam Python itu hashable, sementara mutable container(seperti list atau dictionary) itu sebaliknya. Object instances yang berasal dari user-defined classes secara default bersifat hashable.

      Setiap user-defined classes memiliki __hash__ method, yang mana secara default akan me-return sebuah object ID. Jadi untuk object yang memenuhi criteria hashability tidak selalu immutable.

      Setiap object dari setiap new class yang kita deklarasikan dapat digunakan sebagai dictionary key, kecuali kita sengaja mencegah hal tersebut dengan __hash__.

      Kita juga dapat mengatakan setiap immutable object itu hashable, karena jika hash tersebut berubah selama masa hidup suatu object, maka bisa dibilang object tersebut telah bermutasi.

      Tapi bisa dibilang tidak juga. Bayangkanlah sebuah tuple yang elementnya berisikan list. Kita mengetahui bahwa tuple itu immutable, tapi bersamaan juga list itu mutable, karena itu hal demikian tidaklah bersifat hashable.

      Hashability dan immutability merujuk kepada object instances, tidak kepada type. Contoh, object dengan tuple type dapat berupa hashable ataupun tidak.

  3. Kapan menggunakan List atau Tuples (List vs Tuples)
    stackoverflow
    

    List bisa dilihat sebagaimana adanya, seperti: a list of values, yang setiap elementnya berupa angka, dimulai dari posisi 0 – asumsikan angka pertama adalah 0, kedua angka 1, dan ketiga angaka 2, begitu selanjutnya. Banyak operasi yang dapat dilakukan pada list, seperti menghapus nilai, menambahkan nilai dengan posisi spesifik(misal, posisi akhir dari list) dan banyak lainnya.

    Tuples memiliki banyak kemiripan dengan lists, akan tetapi kita tidak bisa merubah nilai-nilai yang sudah ada sebelumnya. Nilai yang kita inisialisasikan diawal untuk suatu tuple, adalah nilai yang akan terus kita gunakan selama durasi hidup suatu aplikasi.

    Jika lists dan tuples, keduanya menggunakan dasar data structure yang sama, lalu apa perbedaan apa saja yang ada:

    1. Lists adalah dynamic arrays; list itu mutable dan memungkinkan proses resizing (proses merubah jumlah element).
    2. Tuples adalah static arrays; tuple itu immutable, dan data yang telah didefinisikan sebelumnya tidak dapat dirubah.
    3. Tuples itu di cache oleh the Python runtime, yang berarti kita tidak perlu untuk berhubungan dengan kernel untuk mencadangkan block memory setiap kali kita ingin menggunakan object ini.

     

    Perbedaan-perbedaan ini yang mendasari filosofi antar keduanya: tuple itu digunakan untuk bekerja dengan nilai yang bersifat tetap atau tidak berubah, dan list dapat digunakan untuk menyimpan collections of data dengan object yang benar-benar berbeda(dapat berubah-rubah).

    Tapi perlu kita pahami penggunaan keduanya secara bersamaan itu memungkinkan, misal: list dengan tuple element, atau tuple dengan list element.

    Sebagai tambahan, sifat immutability dari sebuah tuple yang bersebrangan dengan list, membuat tuple bisa disebut sebagai lightweight data structure. Hal ini berarti, tidak terlalu banyak overhead dalam memory ketika menyimpannya, dan segala operasi yang dapat dilakukan pada tuple cukup straight‐forward.

    Dengan list, walau dengan segudang kelebihan yang ada, akan tetapi sifat mutability yang dimilikinya menyebabkan cost extra dalam penggunaan system memory dan proses komputasi.


Creation

  1. Create
    peak5390-wordpress
    tutorialspoint
    

    Penggunaan operator matematik seperti + dan * juga dapat dilakukan pada List dan Tuple mirip seperti strings, malahan seluruh operasi umum yang dapat digunakan untuk string juga dapat digunakan pada tuples.

    Python Expression Results Description
    len((1, 2, 3)) 3 Length
    (1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) Concatenation
    (‘ola!’,) * 4 (‘ola!’, ‘ola!’, ‘ola!’, ‘ola!’) Repetition
    3 in (1, 2, 3) True Membership
    for x in (1, 2, 3): print x, 1 2 3 Iteration

  2. Adding

    Jika menambah element pada list menggunakan append bisa dinamakan juga sebagai resizing a list

    Ilustrasi bagaimana list menangani append()

    Ilustrasi bagaimana list menangani append()

  3. Merge atau Join
    stackoverflow-1
    stackoverflow-2
    stackoverflow-3
    

  4. Removing
    stackoverflow
    dotnetperls
    


Manipulation

  1. Slicing
    ramisayar
    stackoverflow
    dotnetpearls
    pythoncentral
    

    list_tuples_6

  2. Sorting
    stackoverflow-1
    stackoverflow-2
    stackoverflow-3
    stackoverflow-4
    pythoncentral
    wiki.python
    

  3. List Comprehension
    secnetix
    python-course
    

    List comprehension bisa dibilang cara yang cukup elegan untuk membuat suatu list. List comprehension juga bisa berfungsi sebagai pengganti untuk lambda function, begitu juga dengan functions map(), filter() dan reduce().

  4. Update item
    stackoverflow-1
    stackoverflow-2
    stackoverflow-3
    stackoverflow-4
    

    Untuk merubah nilai dalam list, dapat dilakukan dengan cara sederhana, cukup dengan memanggil nilai(dapat dengan index ataupun real-valued nilai itu sendiri) dari element dalam list yang ingin kita rubah, dan memberikan kembali nilai tersebut dengan operator =.

  5. Search Operation
    • Linear Search

      Misalkan kita butuh untuk mengambil nilai element pertama dalam suatu array, bisa dengan mudah kita ambil dari bucket pertama dalam urutan M , kemudian ambil nilai yang ada didalamnya.

      Jika kemudian kita butuh untuk mengambil element ke-5 dalam array, bisa kita ambil dari posisi M+5 dari bucket.

      Jika kita mengetahui urutan dari data-data dalam array, dengan mudah kita dapat mencari nilai data tertentu. Bagaimanapun juga, proses yang kita lakukan diatas berupa proses “searching”.

      Pendekatan paling dasar pada proses “searching” adalah “linear search”, yaitu proses melakukan looping pada setiap element dalam array, dan mencocokkan dengan nilai yang kita inginkan.

      Algoritma “linear search”, kalau dalam urusan performa, sebetulnya memiliki performa yang paling buruk, terlebih jika data yang kita cari tidak ada dalam array. Kenapa?

      Karena “linear search”, benar-benar melakukan looping pada setiap element dalam array(mulai dari 0,...,n , bayangkan jika nilai n sangat besar). Dalam Python sendiri “linear search” itu diimplementasikan dalam built-in function list.index().

      Pemahaman mengenai bagaimana data itu diletakkan dalam memory atau pengurutan bucket dimana data itu disimpan, sangat membantu kita dalam rangka meningkatkan performa proses “searching”. Contoh: hash table, yang mana merupakan hal fundamental dari data structure ditionaries dan sets.

    • Binary Search
      interactivepython
      

      BS Algorithm

      BS Algorithm


    • 'in' Search
      Dalam pencarian element atau item dalam list atau tuple (bahkan string) sangat disarankan menggunakan ‘in’, karena sangat cepat, berikut perbandingan performanya:

    penggalan kode untuk komparasi teknik searching:

    akan menghasilkan waktu:

    Komparasi performa metoda pencarian item pada list atau tuple

    Komparasi performa metoda pencarian item pada list atau tuple

  6. Mengetahui Index suatu element pada List dan search by Index
    stackoverflow
    

    Ada 3 cara yang saya ketahui dalam mencari index pada suatu list atau tuple, berikut penggalan kodenya:

    dan seperti biasa, berikut komparasi performa tiap metodanya:

    Komparasi performa metoda pencarian index

    Komparasi performa metoda pencarian index

  7. Komparasi dua List atau Tuple
    untuk membandingkan list atau tuple ada 2 cara yang saya tau, dengan cmp() dan if statement

    berikut penggalan kode untuk komparasi tuple atau list

    berikut perbandingan performanya:

    komparasi performa metoda membandingkan 2 list atau tuple

    komparasi performa metoda membandingkan 2 list atau tuple

  8. Filtering
    mengecek dan menghapus duplikasi

    stackoverflow-1
    stackoverflow-2
    peterbe
    

    penggunaan built-in function filter(), lebih baik tidak ditujukan untuk menghapus duplicate, tapi lebih baik untuk menghapus karakter yang tidak diinginkan dalam list.

    atau akan lebih efisien lagi, ketika kita akan memasukkan item kedalam list, kita cek dulu apakah item yang akan kita masukkan sudah terdapat dalam list atau belum

  9. Mengetahui Intersection
    stackoverflow-1
    stackoverflow-2
    stackoverflow-3
    stackoverflow-4
    stackoverflow-5
    stackoverflow-6
    blog.michelemattioni
    code.activestate
    

Optimization and Collaboration

  1. Named Tuple
    stackoverflow
    pythontips
    benno
    
  2. Array
    docs.python
    stackoverflow
    
  3. Stack, Queue dan Dequeue
    idiotinside
    stackoverflow-1
    stackoverflow-2
    
  4. Range dan Xrange
    stackoverflow-1
    stackoverflow-2
    

    Menggunakan xrange dibanding range jika element dalam list cukup besar, tidak ada ukuran pasti memang, tapi menurut saya mulai dari element 1.000.000, mungkin penggunaan xrange() dapat memberikan performa yang lebih dibanding range().

    Perlu diperhatikan di Python 3 sepertinya xrange()tidak ada lagi, karena range() pada Python 3, berlaku seperti xrange() di Python 2.

    Perlu diketahui maksimal element dalam list pada python sebesar(http://stackoverflow.com/questions/855191/how-big-can-a-python-array-get)

  5. Itertools
    stackoverflow-1
    stackoverflow-2
    stackoverflow-3
    stackoverflow-4
    pythonhackers
    
  6. Other Optimization
    guillaume
    wiki.python
    stackoverflow-1
    stackoverflow-2
    stackoverflow-3
    

Kumpulan Link-link bagus lainnya untuk tambahan:

About Searching
http://stackoverflow.com/questions/4901523/whats-a-faster-operation-re-match-search-or-str-find

About Performace
http://stackoverflow.com/questions/16256913/improving-performance-of-very-large-dictionary-in-python
http://stackoverflow.com/questions/14576838/how-to-create-a-list-that-exceeds-the-maximum-size-in-python
http://stackoverflow.com/questions/1874194/pythonic-way-to-get-the-largest-item-in-a-list
http://stackoverflow.com/questions/1985975/memory-requirments-for-large-python-list

About Memory
http://code.activestate.com/recipes/577504-compute-memory-footprint-of-an-object-and-its-cont/
http://leadsift.com/python-memory-footprint/
http://pythonforbiologists.com/index.php/measuring-memory-usage-in-python/
http://stackoverflow.com/questions/135664/how-many-bytes-per-element-are-there-in-a-python-list-tuple
http://stackoverflow.com/questions/20771470/python-list-memory-usage
http://stackoverflow.com/questions/33978/find-out-how-much-memory-is-being-used-by-an-object-in-python

About Object
http://stackoverflow.com/questions/10759099/difference-between-object-and-instance-in-python
http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python

Other interesting
http://stackoverflow.com/questions/6146963/when-is-del-useful-in-python
http://stackoverflow.com/questions/26545051/is-there-a-way-to-delete-created-variables-functions-etc-from-the-memory-of-th
http://effbot.org/zone/python-list.htm
https://newcircle.com/bookshelf/python_fundamentals_tutorial/advanced_types_containers

Buku yang digunakan:

High Performance Python
Core Python Programming, 2nd Edition

Okay sekian kumpulan tips, trik dan link-link yang berguna dalam penggunaan List dan Tuple pada Python yang ane tau gan, mungkin agan-agan bisa bantu untuk menambahkan.

Cheersss…

You may also like...