Naučite Python strukturu podataka popisa - 1. dio


Struktura podataka je skup vrsta podataka, odnosa među njima i funkcija ili operacija koje se mogu primijeniti na podatke. Tip podataka može biti string, Integer, Floating value i tako dalje.

Koja je razlika između promjenjivog/nepromjenjivog objekta?
Promjenjivi objekti
  1. Objekti čije se stanje može promijeniti nakon što se kreiraju poput dodavanja, ažuriranja ili brisanja elemenata.
  2. Popisi, rječnik, skup, niz bytearray su promjenjivi tipovi objekata u pythonu.
Nepromjenjivi objekti
  1. Stanje objekta ne može se mijenjati. Nakon što je objekt stvoren, ne možemo dodavati, uklanjati ili ažurirati elemente.
  2. String, Integer, Tuples, Frozenset neki su od nepromjenjivih tipova objekata u pythonu.
Koja je razlika između homogene/heterogene strukture podataka?
  1. Homogena struktura podataka – Elementi podataka bit će iste vrste podataka (npr. niz).
  2. Heterogena struktura podataka – Elementi podataka ne moraju biti iste vrste podataka (npr. popis, tuples, skupovi itd…).
Što su primitivni i neprimitivni tipovi podataka?

Prije razumijevanja funkcionalnosti ugrađene strukture podataka, pogledajmo nekoliko ugrađenih funkcija koje će se koristiti s objektima strukture podataka.

  • dir(obj) – ugrađena funkcija koja će vratiti atribut i metode.
  • len(obj) – Vraća duljinu (broj stavki) objekta. Argument može biti niz (kao što je niz, bajtovi, tuple, popis ili raspon) ili zbirka (kao što je rječnik, skup ili zamrznuti skup).
  • del – Ova ugrađena ključna riječ koristi se za brisanje objekta iz prostora imena ili uklanjanje stavki iz objekta poput popisa, rječnika itd.
  • type(obj) – funkcija type() ili vraća tip objekta ili vraća novi tip objekta na temelju proslijeđenih argumenata.
  • id() – Ova funkcija vraća "identitet" objekta. Ovo je cijeli broj koji je zajamčeno jedinstven i konstantan za ovaj objekt tijekom njegovog vijeka trajanja.

Sad kad ste vidjeli nekoliko važnih detalja, nastavimo s Python strukturama podataka.

Python dolazi s ugrađenim strukturama podataka, a korisnici mogu definirati vlastite strukture podataka. Ugrađena struktura podataka uključuje LIST, RJEČNIK, TUPLE i SET. Neki od primjera korisnički definiranih struktura podataka su STACK, QUEUES, TREE, HASHMAP, itd…

Ljudi koji dolaze iz drugih programskih jezika bit će vrlo dobro upoznati s vrstom polja. Ali u pythonu oni nisu tako česti.

Ovdje je popis sličan nizu, ali nam popis omogućuje pohranjivanje vrijednosti bilo kojeg tipa podataka (heterogeno), dok će niz sadržavati podatke samo određenog tipa (int, float itd…). Za korištenje niza morate eksplicitno uvesti niz iz modula "niz".

U ovoj seriji članaka o Pythonu, pogledat ćemo što je struktura podataka i struktura podataka ugrađena u Python.

POPIS

Popis je podatkovna struktura koja je skup različitih vrsta podataka. Što znači “zbirka različitih vrsta podataka”? Popis može pohraniti nizove, cijele brojeve, vrijednosti s pomičnim zarezom, ugniježđeni popis i tako dalje.

Objekti Popisa su “Promjenjivi” što znači da se stavkama stvorenim unutar popisa može pristupiti, mijenjati ili brisati. Popis podržava indeksiranje. Svaka stavka na popisima dodijeljena je adresi i ta se adresa može koristiti za pristup ili izmjenu određene vrijednosti stavke.

  • Napravite popis
  • Umetni/pristupi/izmijeni popis
  • Izbriši popis

IZRADI POPIS

Popis se može izraditi pomoću uglatih zagrada.

>>> name_empty = []			# Empty list
>>> name = ['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']	# list with string data type
>>> name_int = [1,2,3]			# list with Integer data type
>>> name_mixed = [name_int,name,1,2,3.14]	# list with nested list items.
>>> name_mixed
[[1, 2, 3], ['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will'], 1, 2, 3.14]
>>> name_int
[1, 2, 3]

Možemo koristiti ugrađenu funkciju type() za provjeru tipa objekta.

>>> type(name)

Možemo pristupiti metodama i atributima instance list pomoću funkcije dir().

>>> dir(name)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

Ukupan broj stavki na popisu možemo saznati pomoću metode len().

>>> len(name)

Možemo stvoriti novi popis iz postojećeg popisa pomoću metode list.copy().

>>> name_new = name.copy()
>>> name_new
['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']

UMETANJE/PRISTUP/IZMJENA POPISA

Možemo umetnuti stavku u popis na bilo kojem mjestu koristeći list.insert(i, x) metodu.

>>> name = ['Leo','Matt','Kane','Scott','Petter','Will']
>>> name
['Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name.insert(0,'Tom')	# Insert method takes 2 arguments (Index position, Item)
>>> name
['Tom', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']	# Tom is inserted at the 0th position.

Možemo koristiti metodu list.append(x) za dodavanje jedne stavke na popis. Ovo će umetnuti stavku na kraj popisa.

>>> name = []
>>> len(name)
0
>>> name.append('Leo')
>>> name.append('Matt')
>>> name.append('Kane')
>>> print(name)
['Leo', 'Matt', 'Kane']

Možemo koristiti metodu list.extend() za dodavanje više stavki na popis.

>>> new_name = ['Gowtham','Martin','Luis']
>>> name.extend(new_name)
>>> name
['Will', 'Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin', 'Luis']

Također možemo koristiti '+' operator za kombiniranje dva popisa. Oba popisa mogu biti različitih tipova podataka.

>>> a = [1,2,3]
>>> b = [2,3,3]
>>> c = a + b
>>> c
[1, 2, 3, 2, 3, 3]
>>> d = ['karthi','kenny']
>>> e = a + d
>>> e
[1, 2, 3, 'karthi', 'kenny']

Kao što je već rečeno, popisi objekata su promjenjivi. Stavka popisa može se mijenjati upućivanjem na poziciju indeksa i dodjeljivanjem joj vrijednosti.

>>> name									# Before modified
['Tom', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name[0] = 'Karthi'
>>> name									# After Modified
['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']

Popis podržava i pozitivno i negativno indeksiranje.

Indeksiranje počinje od 0, a negativno indeksiranje počinje od -1.

Možemo pristupiti stavci popisa pomoću njihove indeksne pozicije.

>>> name[0]			# Accessing the List item at index 0
'Leo'
>>> name[1]
'Matt'
>>> name[4]
'Petter'
>>> name[5]
'Will'
>>> name[-1]			# Accessing the list item with negative indexing
'Will'
>>> name[-6]
'Leo'

Također možemo koristiti rezanje za pristup stavkama na popisu. Rezanje nam omogućuje pristup nizu stavki definiranjem početnih, završnih i parametara koraka.

SYNTAX: list[starting position, ending position, Step]

>>> name[0:3]
['Tom', 'Leo', 'Matt']
>>> name[:]
['Tom', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name[:4]
['Tom', 'Leo', 'Matt', 'Kane']
>>> name[:-2]
['Tom', 'Leo', 'Matt', 'Kane', 'Scott']
>>> name[:-1]
['Tom', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter']
>>> name[:-1:2]
['Tom', 'Matt', 'Scott']

Možemo pronaći broj pojavljivanja za zadanu vrijednost pomoću metode list.count(x).

>>> name_int = [1,1,2,3,1]
>>> name_int.count(1)
3

Možemo pronaći indeksni položaj date stavke pomoću list.index(x[, start[, end]]) metode.

>>> name			# Inserted ‘Will’ at the end of the list. Now we have 2 name ‘Will’.
['Will', 'Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will']
>>> name.index('Will)	# Returns the index position of first occurence of x.
0
>>> name.index('Will',2)	# Starting index positon’2’ is given.
7
>>> name.index('Will',2,4)	# Starting and Ending Index position is given. Since there is no 					occurence of ‘Will’ within the given search position it will throw 					Value Error.
Traceback (most recent call last):
File "<stdin>", line 1, in 
ValueError: 'Will' is not in list

Možemo koristiti metodu list.reverse() za preokretanje stavki na popisu.

>>> name
['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name.reverse()
>>> name
['Will', 'Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi']

IZBRIŠI POPIS

Možemo koristiti metodu list.pop(x) za uklanjanje stavke s popisa na poziciji x. Ova funkcija će ukloniti stavku s popisa i prikazati uklonjenu stavku. Ako x nije naveden tada će metoda pop() vratiti posljednju stavku s popisa.

>>> name
['Will', 'Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin', 'Luis']
>>> name.pop(0)
'Will'
>>> name
['Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin', 'Luis']
>>> name.pop()
'Luis'

Također možemo koristiti metodu list.remove (x) za uklanjanje stavke s popisa. Ovdje x uzima vrijednost stavke i izbacuje ValueError ako x nije na popisu.

>>> name = ['Leo','Matt','Kane','Scott','Petter','Will']
>>> name.remove('Leo')
>>> name
['Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name.remove('Leo')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: list.remove(x): x not in list

Popis možemo učiniti praznim tako da naziv popisa dodijelimo uglatim zagradama ili pomoću metode list.clear().

>>> name1 = name.copy()
>>> name1
['Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin']
>>> name
['Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin']
>>> name = []			
>>> name
[]
>>> name1.clear()		
>>> name1
[]

Umjesto korištenja metoda popisa da ispraznimo popis ili uklonimo stavku s popisa, možemo koristiti ugrađenu ključnu riječ del za izvođenje ovih radnji. Ključna riječ “del” može izbrisati objekt popisa iz memorije ili izbrisati stavku s popisa ili izbrisati stavku s odsječka.

>>> name = ['Leo','Matt','Kane','Scott','Petter','Will']
>>> del name[0]
>>> name
['Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> del name[-3:]
>>> name
['Matt', 'Kane']
>>> del name[:]
>>> name
[]

Ugrađena funkcija id() vraća “identitet” objekta. Ovo je cijeli broj koji je zajamčeno jedinstven i konstantan za ovaj objekt tijekom njegovog vijeka trajanja.

>>> id(name)
139979929658824
>>> del name
>>> id(name)
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'name' is not defined

Napomena: uklonili smo varijablu popisa iz memorije pomoću del(), stoga izbacuje pogrešku naziva.

help() funtion:

Ugrađena pomoć function() vrlo je korisna za dobivanje pojedinosti o određenom objektu ili metodama tog objekta.

help(object)
help(object.method)
Sažetak

Do sada smo u ovom članku vidjeli kako možemo koristiti strukturu podataka popisa za pohranu, pristup, izmjenu, brisanje objekata popisa pomoću metoda popisa. Također smo vidjeli neke ugrađene funkcije kao što su id(), dir(), type(), help()< što su vrlo učinkovite funkcije. Imamo i razumijevanje popisa u pythonu koji pruža koncizniji i čitljiviji način stvaranja popisa.