Python - Skupovi (Sets)


Stvaranje Python skupova

Skup se kreira stavljanjem svih stavki (elemenata) u vitičaste zagrade {}, odvojenih zarezom ili pomoću ugrađene funkcije set(). Može imati bilo koji broj predmeta i mogu biti različitih vrsta (cijeli broj, float, tuple, string itd.). Ali skup ne može imati izmjenjive elemente kao liste, skupove ili rječnike (dictionaries) kao svoje elemente.

# Različite vrste skupova u Python-u
# postavljanje cijelih brojeva (integers)
my_set = {1, 2, 3}
print(my_set)

# skup mješovitih tipova podataka
my_set = {1.0, "Pozdrav", (1, 2, 3)}
print(my_set)

Isprobajte i sljedeće primjere.

# set ne može imati duplikate
# Ispisuje: {1, 2, 3, 4}
my_set = {1, 2, 3, 4, 3, 2}
print(my_set)

# možemo napraviti set sa liste
# Ispisuje: {1, 2, 3}
my_set = set([1, 2, 3, 2])
print(my_set)

# set ne može imati promjenjive predmete
# ovdje [3, 4] je promjenjiva lista
# ovo će uzrokovati grešku.

my_set = {1, 2, [3, 4]}

Stvaranje praznog skupa pomalo je nezgodno. Prazne vitičaste zagrade {} stvoriće prazan rječnik (dictionary) u Pythonu. Da bismo napravili skup bez ikakvih elemenata, koristimo funkciju set() bez ikakvog argumenta.

# Razlikovati skup i rječnik dok kreirate prazan skup

# inicijalizacija sa praznim vitičastim zagradama {}
a = {}

# provjera tipa podataka a
print(type(a))

# inicijalizacija sa set()
a = set()

# provjera tipa podataka a
print(type(a))


Izmjena skupa u Pythonu

Skupovi su promjenjivi. Međutim, budući da su neuređena, indeksiranje nema značenja. Ne možemo pristupiti niti promijeniti element seta pomoću indeksiranja ili rezanja. Postavljeni tip podataka ga ne podržava. Možemo dodati jedan element pomoću metode add(), a više elemenata pomoću metode update(). Metoda update() može kao svoj argument uzeti korijene, liste, nizove ili druge skupove. U svim se slučajevima izbjegavaju duplikati.

# inicijalizacija my_set
my_set = {1, 3}
print(my_set)

# ako komentarišete red 9,
# dobićete grešku
# TypeError: 'set' object does not support indexing

# my_set[0]

# dodavanje element
# Ispisuje: {1, 2, 3}
my_set.add(2)
print(my_set)

# dodavanje više elemenata
# Ispisuje: {1, 2, 3, 4}
my_set.update([2, 3, 4])
print(my_set)

# dodavanje liste i postavljanje
# Ispisuje: {1, 2, 3, 4, 5, 6, 8}
my_set.update([4, 5], {1, 6, 8})
print(my_set)


Uklanjanje elemenata iz skupa

Određeni predmet može se ukloniti iz skupa metodama discard() i remove(). Jedina razlika između njih dvije je što funkcija discard() ostavlja skup nepromijenjenim ako element nije prisutan u skupu. S druge strane, funkcija remove() će dovesti do pogreške u takvom stanju (ako element nije prisutan u skupu). Slijedeći primjer će to ilustrirati.

# Razlika između discard() i remove()

# inicijalizacija my_set
my_set = {1, 3, 4, 5, 6}
print(my_set)

# odbaciti element
# Ispisuje: {1, 3, 5, 6}
my_set.discard(4)
print(my_set)

# ukolni element
# Ispisuje: {1, 3, 5}
my_set.remove(6)
print(my_set)

# odbaci element
# nije prisutan u my_set
# Ispisuje: {1, 3, 5}
my_set.discard(2)
print(my_set)

# ukloni element
# nije prisutan u my_set
# dobićete grešku.
# Ispisuje: KeyError

my_set.remove(2)

Slično tome, možemo ukloniti i vratiti stavku metodom pop(). Budući da je set neuređeni tip podataka, ne postoji način određivanja koja će stavka biti izbačena. Potpuno je proizvoljan. Takođe možemo ukloniti sve stavke iz skupa metodom clear().

# inicijalizacija my_set
# Ispisuje: skup jedinstvenih elemenata
my_set = set("HelloWorld")
print(my_set)

# pop element
# Ispisuje: slučajni element
print(my_set.pop())

# pop drugi element
my_set.pop()
print(my_set)

# clear my_set
# Ispisuje: set()
my_set.clear()
print(my_set)

print(my_set)


Python operacije skupova (Set)

Skupovi se mogu koristiti za izvođenje matematičkih skupovnih operacija poput spajanja, presjeka, razlike i simetrične razlike. To možemo učiniti s operatorima ili metodama. Razmotrimo sljedeća dva skupa za sljedeće operacije.

>>> A = {1, 2, 3, 4, 5}
>>> B = {4, 5, 6, 7, 8}

Unija skupova (Set Union)


Unija A i B je skup svih elemenata iz oba skupa. Spajanje se vrši pomoću | operater. Isto se može postići metodom union().

# Set union method
# inicijalizacija A i B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# koristimo | operater
# Ispisuje: {1, 2, 3, 4, 5, 6, 7, 8}
print(A | B)

Isprobajte sljedeće primjere na Python shell.

# koristiti funkciju unije
>>> A.union(B)
{1, 2, 3, 4, 5, 6, 7, 8}

# koristiti funkciju unije na B
>>> B.union(A)
{1, 2, 3, 4, 5, 6, 7, 8}

Presjek skupa (Set Intersection)



Presjek A i B skup je elemenata koji su zajednički u oba skupa. Presjek se vrši pomoću & operatora. Isto se može postići metodom intersection().

# Presjek skupova
# inicijalizacija A i B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# korištenje & operatora
# Ispisuje: {4, 5}
print(A & B)

Isprobajte sljedeće primjere na Python shell.

# koristiti funkciju presjeka na A
>>> A.intersection(B)
{4, 5}

# koristiti funkciju presjeka na B
>>> B.intersection(A)
{4, 5}

Razlika skupova (Set Difference)



Razlika skupa B od skupa A (A - B) je skup elemenata koji se nalaze samo u A, ali ne i u B. Slično tome, B - A je skup elemenata u B, ali ne i u A. Razlika se vrši pomoću - operatora. Isto se može postići i metodom difference().

# Difference of two sets
# inicijalizacija A i B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# korištenje - operatora na A
# Ispisuje: {1, 2, 3}
print(A - B)

Isprobajte sljedeće primjere na Python shell.

# use difference function on A
>>> A.difference(B)
{1, 2, 3}

# korištenje - operatora na B
>>> B - A
{8, 6, 7}

# korištenje difference funkcije na B
>>> B.difference(A)
{8, 6, 7}

Simetrična razlika skupa (Set Symmetric Difference)



Simetrična razlika A i B skup elemenata je u A i B, ali ne u oba (isključujući presjek). Simetrična razlika se izvodi pomoću operatora ^. Isto se može postići metodom symmetric_difference().

# Simetrična razlika dva skupa
# inicijalizacija A i B
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}

# korištenje ^ operatora
# Ispisuje: {1, 2, 3, 6, 7, 8}
print(A ^ B)

Isprobajte sljedeće primjere na Python shell.

# korištenje symmetric_difference funkcije na A
>>> A.symmetric_difference(B)
{1, 2, 3, 6, 7, 8}

# korištenje symmetric_difference funkcije na B
>>> B.symmetric_difference(A)
{1, 2, 3, 6, 7, 8}