Modul 8: Tipe Data Terstruktur¶
Chapter ini akan membahas beberapa struktur data built-in dari Python. Namun struktur data serupa juga ada di berbagai bahasa pemrograman lainnya dengan nama yang mungkin berbeda. Sebelumnya kita telah mengenal dan menggunakan data yang bersifat Primitif, yang bisa diartikan sederhana, yaitu int
, float
, string
, boolean
. Tipe data tersebut hanya menyimpan satu buah nilai saja. Sedangkan pada pemrograman, banyak sekali kebutuhan untuk menyimpan dan memanipulasi sejumlah data. Untuk itu, sekarang kita akan membahas struktur data, yang artinya tipe data yang dapat menyimpan banyak nilai dan memiliki struktur tertentu. Salah satu yang pernah kita gunakan adalah list
, pada saat membahas for
. Di chapter ini kita akan membahas lebih dalam beserta jenis lainnya yaitu tuple, set, dan dictionary.
List¶
Berikut adalah karakteristik tipe data List.
List dapat menyimpan elemen dengan tipe data berbeda-beda
List mempunyai index(posisi), sehingga elemen tersimpan terurut berdasarkan index
List dan elemen list bersifat mutable, artinya list dapat diubah (ditambah, dikurangi), dan elemennya dapat diganti
Elemen list boleh redundan (ada beberapa elemen yang sama)
Membuat List¶
Untuk membuat sebuah list baru di Python, kita cukup menggunakan tanda buka dan tutup kurung siku []
atau list()
. Jika list baru memiliki elemen, nilainya diletakkan di dalam kurung tersebut dan antar elemen list dipisahkan dengan koma.
my_list1 = [] # list kosong
my_list2 = [1, 2, 3, 3] # list berisi integer
my_list3 = [True, 2, 'Tiga'] # list berisi nilai dengan berbeda type
my_list4 = [[90, 90], [100, 90]] # list berisi list lain
my_list5 = list([1, 2, 3])
print(my_list1)
print(my_list2)
print(my_list3)
print(my_list4)
print(my_list5)
[]
[1, 2, 3, 3]
[True, 2, 'Tiga']
[[90, 90], [100, 90]]
[1, 2, 3]
Mengakses Elemen List¶
Akses dengan Index (<my_list>[<index>]
)
Untuk mengakses nilai pada elemen list, kita bisa menggunakan [<index>]
. Index pada Python dimulai dari 0
.
print(my_list2[2]) # mengakses elemen ke-3, yaitu integer 3
print(my_list3[0]) # mengakses elemen ke-1, yaitu boolean True
print(my_list4[0]) # mengakses elemen ke-1, yaitu list berisi [90, 90]
print(my_list4[1][0]) # mengakses elemen ke-1 dari elemen ke-2 my_list ([100, 90]), yaitu integer 100
3
True
[90, 90]
100
Akses dengan Index Negatif
Python juga menyediakan cara untuk mengakses dari elemen terakhir pada list, yaitu melalui index bernilai negatif. Elemen terakhir bisa diakses melalui [-1]
, elemen kedua terakhir diakses dengan [-2]
, dan seterusnya.
Perhatikan, agar berbeda dengan akses dari depan, di mana dimulai dari 0
, akses dari belakang tidak dimulai dari -0
, tetapi -1
.
print(my_list2[-1]) # mengakses elemen terakhir, yaitu integer 3
print(my_list3[-3]) # mengakses elemen ke-3 dari terakhir, yaitu boolean True
3
True
Error pada Akses List
Beberapa error yang bisa dijumpai pada saat akses elemen list adalah:
list belum dibuat
index list melebihi jumlah elemen pada list
index bukan integer
try:
my_list6[0] # my_list5 belum ada
# ini adalah cara untuk menangkap exception, lalu di aliaskan dengan variable e,
# sehingga kita bisa printkan messagenya. Program tidak berhenti, namun pesan error tetap diketahui
except Exception as e:
print('Error:', e)
try:
print(my_list2[3]) # my_list2 cuma berisi 3 elemen, sementara ingin diakses elemen ke-4
except Exception as e:
print('Error:', e)
try:
print(my_list2[3.0]) # akses tidak bisa menggunakan float, harus integer
except Exception as e:
print('Error:', e)
Error: name 'my_list6' is not defined
3
Error: list indices must be integers or slices, not float
Mencari Index pada List (<my_list>.index(<nilai>)
)
Selain mengakses elemen list berdasarkan index, kita juga bisa melakukan sebaliknya, yaitu mencari index/posisi dari suatu nilai.
print(my_list2.index(2)) # mendapatkan index dari nilai 2
print(my_list3.index('Tiga')) # mendapatkan index dari nilai 'Tiga'
1
2
Namun harus berhati-hati, jika nilai yang dicari tidak ada di dalam index, maka akan memunculkan exception seperti di bawah ini. Disarankan menggunakan exception handling jika ingin menggunakan .index()
.
print(my_list2.index(10))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-28-aa2e8f25c7f1> in <module>
----> 1 print(my_list2.index(10))
ValueError: 10 is not in list
Cek Keanggotaan List (<nilai> in <my_list>
)
Misalnya kita ingin tau apakah 10
ada di dalam my_list2 atau tidak, maka selain menggunakan .index()
(jika tidak error berarti nilai ada dalam list), kita bisa menggunakan operator in
yang akan mengembalikan True
jika ada, dan False
jika nilai tidak ada. Karena menghasilkan boolean, operator in
sering digunakan sebagai kondisi pada statement if
.
print(10 in my_list2)
if 1 in my_list2:
print("Sudah ada dalam list")
False
Sudah ada dalam list
Iterasi Elemen List (for <my_var> in <my_list>:
)
Cara lain untuk mengakses elemen list adalah melalui pengulangan seperti berikut ini:
my_list = [5, 'empat', 3, (2, 1)]
for i in my_list: # mengakses seluruh elemen list satu per satu
print(i)
sum_int = 0
for x in my_list: # mengakses seluruh elemen list satu per satu
if isinstance(x, int):
sum_int += x
print('Jumlah integer:',sum_int)
5
empat
3
(2, 1)
Jumlah integer: 8
Slice pada List (<my_list>[<start>:<end>]
)
Selain mengakses elemen satu per satu, Python juga menyediakan pengaksesan beberapa elemen sekaligus, yang biasa disebut dengan slicing. Sebagai contoh, misalnya array menyimpan data nilai siswa mulai dari yang pertama didapat sampai yang terakhir didapat seorang siswa, maka kita bisa mendapatkan misalnya 3 nilai terakhir siswa tersebut, atau 5 nilai pertama, dan seterusnya. Slicing pada python menggunakan tanda [<start>:<end>]
(titik dua), dan elemen yang dikembalikan adalah elemen dari index ke <start>
sampai ke <end>-1
.
my_list = [90,80,95,85,85,100,88,98,79,80]
print(my_list[0:5]) # akan mengambil 5 elemen, yaitu di index ke-0, 1, 2, 3, dan 4 (end-1).
print(my_list[-3:]) # akan mengambil elemen mulai dari index -3, sampai selesai. Jika <end> kosong, maka artinya sampai selesai.
print(my_list[:5]) # jika <start> kosong, maka artinya dimulai dari awal
print(my_list[3:5])
[90, 80, 95, 85, 85]
[98, 79, 80]
[90, 80, 95, 85, 85]
[85, 85]
Menambah Elemen List¶
Menambah 1 buah elemen di akhir list menggunakan append:
<my_list>.append(<nilai>)
Menambah beberapa buah elemen sekligus di akhir list menggunakan extend:
<my_list>.extend(<iterable>)
Menambah satu buah item di posisi tertentu dengan insert:
<my_list>.insert(<index>, <nilai>)
Notes: iterable adalah sebuah object yang bisa diakses elemennya satu per satu. Contoh iterable object adalah list
, str
, tuple
, dict
, file
.
my_list = [1,'dua',3]
my_list.append('empat')
print(my_list)
my_list.extend([5, 6, 7])
print(my_list)
my_list.extend('halo') # 'halo' adalah iterable, sehingga setiap hurufnya menjadi satu buah elemen
print(my_list)
my_list.insert(1, 100) # menambahkan 100 di index ke-1 (posisi ke-2 di list), dan menggeser elemen setelahnya 1 posisi
print(my_list)
[1, 'dua', 3, 'empat']
[1, 'dua', 3, 'empat', 5, 6, 7]
[1, 'dua', 3, 'empat', 5, 6, 7, 'h', 'a', 'l', 'o']
[1, 100, 'dua', 3, 'empat', 5, 6, 7, 'h', 'a', 'l', 'o']
Mengubah Elemen List¶
Karena sifatnya mutable, maka elemen list dapat diupdate nilainya dengan re-assignment.
my_list = [90,80,95,85,85,100,88,98,79,80]
my_list[0] = 10 # update 1 buah nilai
my_list[3:5] = [10, 10] # update beberapa nilai sekaligus dengan slicing
print(my_list)
[10, 80, 95, 10, 10, 100, 88, 98, 79, 80]
Menghapus Elemen List¶
Menghapus berdasarkan nilai dengan remove:
<my_list>.remove(<nilai>)
Menghapus berdasarkan index dengan pop:
<my_list>.pop(<index>)
. Jika index tidak diberikan, maka dianggap index terakhirMenghapus semua elemen dengan clear:
<my_list>.clear()
my_list = [90,80,95,85,85,100,88,98,79,80]
my_list.remove(80) # menghapus elemen 80 yang pertama kali ditemukan
print(my_list)
my_list.pop(4) # menghapus elemen ke-4 yaitu 100
print(my_list)
my_list.pop() # menghapus elemen terakhir yaitu 80
print(my_list)
nilai = my_list.pop(1) # pop akan mereturn nilai yang dikeluarkan dari list, sehingga bisa disimpan di sebuah variable untuk diproses lebih lanjut
print(nilai, my_list)
my_list.clear() # hapus semua elemen list
print(my_list)
[90, 95, 85, 85, 100, 88, 98, 79, 80]
[90, 95, 85, 85, 88, 98, 79, 80]
[90, 95, 85, 85, 88, 98, 79]
95 [90, 85, 85, 88, 98, 79]
[]
Tuple¶
Berikut adalah karakteristik tipe data Tuple.
Tuple dapat menyimpan elemen dengan tipe data berbeda-beda
Tuple mempunyai index(posisi), sehingga elemen tersimpan terurut berdasarkan index
Tuple dan elemen tuple bersifat immutable, artinya tuple tidak dapat diubah (ditambah, dikurangi), dan elemennya tidak dapat diganti. Namun, jika ada elemen tuple bersifat mutable seperti list, maka list tersebut tetap dapat diubah.
Elemen tuple boleh redundan (ada beberapa elemen yang sama)
Membuat Tuple¶
my_tuple = tuple() # bisa dengan tuple()
print(my_tuple)
my_tuple1 = ("Jono", 24, 175, 60) # atau cukup dengan buka dan tutup kurung
print(type(my_tuple1))
my_tuple2 = "Jene", 25, 165, 50
print(type(my_tuple2))
# khusus jika tuple hanya berisi 1 item, maka perlu ditambahkan 1 buah koma stelahnya
my_tuple3 = (1,)
print(type(my_tuple3))
my_tuple4 = 1,
print(type(my_tuple4))
# jika tanpa koma maka tidak menjadi tuple
my_tuple5 = (1)
print(type(my_tuple5))
# seperti list, bisa berisi type data berbeda, termasuk tuple dan list
my_tuple6 = (1, 2, 1, (4, 5), [1, 2])
print(my_tuple6)
()
<class 'tuple'>
<class 'tuple'>
<class 'tuple'>
<class 'tuple'>
<class 'int'>
(1, 2, 1, (4, 5), [1, 2])
Mengakses Elemen Tuple¶
Mengakses elemen tuple sama seperti pada List. Mencari index, cek keanggotaan, slicing, dan iterasi juga berlaku untuk tuple.
my_tuple6 = (1, 2, 1, (4, 5), [1, 2])
print(my_tuple6[1])
print(my_tuple6[-1])
print(my_tuple6[3][1])
print(my_tuple6[1:4])
print(my_tuple6.index(2))
print((4, 5) in my_tuple6)
2
[1, 2]
5
(2, 1, (4, 5))
1
True
Mengubah, Menambah, Menghapus¶
Karena Tuple bersifat immutable, maka tuple tidak bisa dimodifikasi dengan mengganti, menambah, atau menghapus elemennya. Namun, seandainya ada elemen dari tuple bersifat mutable, maka kita bisa memodifikasi elemen yang bersifat mutable tersebut.
my_tuple = ("immutable", ["mutable1", "mutable2"]) # tuple immutable, namun elemen kedua tersebut adalah sebuah list yang mutable
try:
my_tuple[1] = ["test", "test"] #akan menimbulkan error
except Exception as e:
print('Error:', e)
my_tuple[1][0] = "mutable3" # tidak error
print(my_tuple)
my_tuple[1].append("mutable4") # juga diperbolehkan karena mengubah mutable object
print(my_tuple)
Error: 'tuple' object does not support item assignment
('immutable', ['mutable3', 'mutable2'])
('immutable', ['mutable3', 'mutable2', 'mutable4'])
Set¶
Berikut adalah karakteristik tipe data Set.
Set dapat menyimpan elemen dengan tipe data berbeda-beda, namun elemen set harus bersifat immutable
Set tidak mempunyai index(posisi), sehingga elemen set tidak memiliki urutan tertentu.
Set bersifat mutable, artinya set dapat diubah (ditambah, dikurangi), namun elemennya tidak dapat diubah.
Elemen set tidak redundan (hanya menyimpan elemen unik)
Membuat Set¶
my_set1 = {1, 4, 'telU', 4} # membuat set dengan kurung kurawal, set hanya akan menyimpan 1 buah nilai 4
print(my_set1)
my_set2 = set([1, 'telu', 4, 'telu']) # membuat set dengan set()
print(my_set2)
my_set3 = {} # jika set awal kosong, maka membuat set hanya bisa dengan set(). Karena {} digunakan untuk membuat dictionary
print(type(my_set3))
my_set4 = set()
print(type(my_set4))
my_set5 = {1, 4, 'telU', [1, 2]} # jika elemen set ada yang bersifat mutable, maka akan terjadi error
{1, 4, 'telU'}
{1, 4, 'telu'}
<class 'dict'>
<class 'set'>
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-cbceb92b3d5a> in <module>
7 my_set4 = set()
8 print(type(my_set4))
----> 9 my_set5 = {1, 4, 'telU', [1, 2]} # jika elemen set ada yang bersifat mutable, maka akan terjadi error
TypeError: unhashable type: 'list'
Mengakses Elemen Set¶
Karena Set tidak memiliki index, sehingga pengaksesan elemen juga tidak bisa dilakukan melalui index seperti pada list dan tuple. Namun pengaksesan dengan cek keanggotaan dan iterasi dapat dilakukan pada set.
my_set = {1, 2, 3}
print(5 in my_set)
for i in my_set: # perlu diingat set tidak terurut, sehingga urutannya bisa berubah dan tidak konsisten
print(i)
False
1
2
3
Menambah Elemen Set¶
Menambah 1 item dengan add
Menambah banyak item dengan update
Perhatikan bahwa yang bisa menjadi elemen dari Set hanya tipe data yang bersifat immutable, sehingga list tidak bisa menjadi elemen dari set. Salah satu cara agar bisa menjadi elemen adalah dengan mengubah ke bentuk tuple.
my_set = {1, 2, 3}
my_set.add(5)
print(my_set)
my_set.update([6, 7, 8])
print(my_set)
try:
my_set.add([9, 10])
except Exception as e:
print('Error:', e)
my_set.add(tuple([9, 10]))
print(my_set)
{1, 2, 3, 5}
{1, 2, 3, 5, 6, 7, 8}
Error: unhashable type: 'list'
{1, 2, 3, 5, 6, 7, 8, (9, 10)}
Mengubah Elemen Set¶
Meskipun Set bersifat mutable, namun elemen pada set tidak bisa diubah atau diganti setelah ditambahkan ke dalam set.
Menghapus Elemen Set¶
Elemen set dapat dihapus dengan remove:
<my_set>.remove(<nilai>)
. Namun akan menimbulkan exception jika<nilai>
tidak terdapat di dalam set.Elemen set dapat juga dihapus dengan discard:
<my_set>.discard(<nilai>)
. Jika<nilai>
tidak ada di dalam set, maka tidak menimbulkan exception.Elemen set dapat dihapus dengan pop, pop akan menghapus 1 buah sembarang elemen, dan mereturn elemen yang dihapus tersebut.
my_set = {1, 2, 3, 4}
my_set.remove(1)
print(my_set)
try:
my_set.remove(5) # menimbulkan exception karena 5 tidak ada dalam set.
except Exception as e:
print('Error:', e)
my_set.discard(4)
print(my_set)
my_set.discard(5) # tidak menimbulkan exception meskipun 5 tidak ada dalam set.
print(my_set)
p = my_set.pop()
print('pop1:', p, my_set)
q = my_set.pop()
print('pop2:', q, my_set)
r = my_set.pop() # menimbulkan exception karena set kosong, tidak ada nilai yang bisa di-pop
print('pop3:', r, my_set)
{2, 3, 4}
Error: 5
{2, 3}
{2, 3}
pop1: 2 {3}
pop2: 3 set()
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-51-0f116f5c4e32> in <module>
19 q = my_set.pop()
20 print('pop2:', q, my_set)
---> 21 r = my_set.pop() # menimbulkan exception karena set kosong, tidak ada nilai yang bisa di-pop
22 print('pop3:', r, my_set)
KeyError: 'pop from an empty set'
Dictionary¶
Karakteristik tipe data Dictionary yaitu:
Data tersimpan dalam bentuk pasangan Key dan Value
Key harus bersifat immutable dan unik, sedangkan Value boleh memiliki tipe berbeda-beda baik mutable maupun immutable.
Dictionary tidak mempunyai index, sehingga elemen tidak memiliki urutan tertentu
Dictionary bersifat mutable, artinya bisa ditambah atau dikurangi.
Membuat Dictionary¶
Dictionary dapat dibuat dengan dua buah cara yaitu melalui {}
atau dict()
:
{key1: value1, key2: value2, ...}
dict([(key1, value1), (key2, value2), ... ])
my_dict1 = {}
print(type(my_dict1))
my_dict2 = dict()
print(type(my_dict2))
my_dict3 = {1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
my_dict4 = dict([(1, 'satu'), (2, 'dua'), ((3, 4), [1, 2, 3]), ('four', {1: 'senin', 2: 'selasa'})])
print(my_dict3)
print(my_dict4)
my_dict5 = {[1, 2]: 'satu'} #error karena key tidak boleh mutable
<class 'dict'>
<class 'dict'>
{1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
{1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-11-3017160b661f> in <module>
11 print(my_dict4)
12
---> 13 my_dict5 = {[1, 2]: 'satu'} #error karena key tidak boleh mutable
TypeError: unhashable type: 'list'
Mengakses elemen Dictionary¶
Akses dengan Key
Akses dengan key dapat dilakukan dengan 2 cara yaitu melalui []
dan .get()
:
<my_dict>[<key>]
: jika key tidak ada dalam dictionary, akan mengeluarkan exception<my_dict>.get(<key>)
: jika key tidak ada dalam dictionary, akan mengembalikanNone
my_dict = {1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
print(my_dict[1])
print(my_dict[(3, 4)])
print(my_dict['four'])
print(my_dict['four'][2])
print(my_dict.get(10))
print(my_dict[10]) #akan menimbulkan exception KeyError
satu
[1, 2, 3]
{1: 'senin', 2: 'selasa'}
selasa
None
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-16-44771564c881> in <module>
8 print(my_dict.get(10))
9
---> 10 print(my_dict[10]) #akan menimbulkan exception KeyError
KeyError: 10
Cek Keanggotaan Dictionary (<key> in <my_dict>
)
my_dict = {1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
print(1 in my_dict)
print(10 in my_dict)
True
False
Iterasi Elemen Dictionary
Pertama, iterasi melalui key: (
for <my_key> in <my_dict>:
)Kedua, kedua iterasi melalui key dan vlaue: (
for <my_key>, <my_val> in <my_dict>.items():
)
my_dict = {1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
for k in my_dict:
print(k)
for k, v in my_dict.items():
print('key:', k,' val:', v)
1
2
(3, 4)
four
key: 1 val: satu
key: 2 val: dua
key: (3, 4) val: [1, 2, 3]
key: four val: {1: 'senin', 2: 'selasa'}
Menambah Elemen dan Mengganti Value¶
Untuk menambahkan pasangan key-value baru ke dalam dictionary, cukup assign value ke key tersebut: <my_dict>[<key>] = <value>
. Jika <key>
belum ada di dalam dictionary, maka pasangan key-value tersebut akan ditambahkan ke dalam dictionary, tetapi jika key sudah ada di dalam dictionary, maka value dari key tersebut akan diupdate dengan yang baru di-assign.
my_dict = {1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
my_dict[10] = 'sepuluh' #key 10 belum ada, sehingga ditambahkan pasangan key-value ke dalam dictionary
print(my_dict)
my_dict[10] = 'ten' #key 10 sudah ada, sehingga value diupdate
print(my_dict)
{1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}, 10: 'sepuluh'}
{1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}, 10: 'ten'}
Menghapus Elemen Dictionary¶
Untuk menghapus elemen ada beberapa opsi:
Menghapus elemen berdasarkan key tertentu dengan pop:
<my_dict>.pop(<key>)
. Jika key tidak ada, maka akan menimbulkan exceptionMenghapus sebuah elemen sembarang dengan popitem:
<my_dict>.popitem()
. Jika dictionary kosong akan menimbulkan exceptionMenghapus semua elemen dengan clear:
<my_dict>.clear()
.
my_dict = {1: 'satu', 2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
v = my_dict.pop(1) #pop mengembalikan value dari key yang di-pop
print(v)
print(my_dict)
kv = my_dict.popitem() #popitem mengembalikan sembarang tuple (key, value)
print(kv)
my_dict.clear()
print(my_dict)
satu
{2: 'dua', (3, 4): [1, 2, 3], 'four': {1: 'senin', 2: 'selasa'}}
('four', {1: 'senin', 2: 'selasa'})
{}
Selamat anda telah menyelesaikan Modul 8!!
Mohon berkenan memberikan Rating dan Feedback agar kami dapat meningkatkan kualitas modul ini!