Ta strona wykorzystuje ciasteczka ("cookies") w celu zapewnienia maksymalnej wygody w korzystaniu z naszego serwisu. Czy wyrażasz na to zgodę?

Czytaj więcej
< All Topics
Print

Zbiory

Tworzenie zbiorów

 

Operowanie zbiorami jest proste tylko w realnym świecie. Przy zapisie elementów zbioru na kartce, płytkach CD i każdym innym nośniku informacji, automatycznie przydziela się elementom zbioru miejsce i kolejność na liście. Wykreślanie starych i wstawianie nowych elementów wymaga przepisania listy. Typ ‘set’ w Pythonie powstał po to, by efekty te zminimalizować i operacje na zbiorach w Pythonie były równie efektywne, jak na zbiorach utworzonych eksperymentalnie.

Zbiór tworzy się za pomocą funkcji set() albo nawiasów klamrowych. Argumentem funkcji set musi być lista albo zbiór znaków otoczony apostrofami.

zbior={‘A’,’B’,’R’,’A’,’K’,’A’,’D’,’A’,’B’,’R’,’A’}
print(zbior)
zbior=set([‘A’,’B’,’R’,’A’,’K’,’A’,’D’,’A’,’B’,’R’,’A’])
print(zbior)
zbior=set(‘ABRAKADABRA’)
print(zbior)
>>>
{‘D’, ‘A’, ‘K’, ‘R’, ‘B’}
{‘D’, ‘K’, ‘R’, ‘A’, ‘B’}
{‘D’, ‘K’, ‘R’, ‘A’, ‘B’}

W zbiorach różne elementy nie mogą mieć tych samych wartości. Stąd ze słowa ‘ABRAKADABRA’ powstaje tylko pięcioelementowy zbiór liter.

Zbiory liczbowe tworzy się podobnie.

zbior=set([0,1,2,3,4,5,1,3,5,7])
print(zbior)
zbior=set(‘0123451357’)
print(zbior)
zbior={0,1,2,3,4,5,1,3,5,7}
print(zbior)
>>>
{0, 1, 2, 3, 4, 5, 7}
{‘4’, ‘7’, ‘3’, ‘2’, ‘0’, ‘1’, ‘5’}
{0, 1, 2, 3, 4, 5, 7}

Możliwe jest utworzenie zbioru pustego, ale tylko za pomoca funkcji set(). Sprawdzenie czy typ wyniku wskazuje na zbiór, można wykonać przy pomocy funkcji type().

bior=set()
print(type(zbior))
zbior=set([])
print(type(zbior))
zbior={}
print(type(zbior))
>>>
<class ‘set’>
<class ‘set’>
<class ‘dict’>

Wprowadzany w programie element {} traktowany jest jako pusty słownik, a nie jako zbiór.

 

 

Odwołanie się do wybranych elementów zbiorów

 

Poszczególne elementy zbioru nie są indeksowane i nie można się do nich odwołać poprzez wskazanie pozycji w nawiasach kwadratowych. Możliwe jest co najwyżej sprawdzenie, czy jakiś element należy do zbioru, czy nie. Wykonuje się to relacją ‘in’.

zbior=set(‘czarymary’)
print(‘a’ in zbior)
print(‘b’ in zbior)
print(‘c’ not in zbior)
>>>
True
False
False

 

 

Edycja zbiorów

 

Metody add(x), remove(x), discard(x) dodają i usuwają element x ze zbioru. Metoda discard robi to warunkowo, pod warunkiem, że element x występuje w zbiorze. Nie wywołuje przez to błędu i nie przerywa programu w przeciwieństwie do metody remove.

zbior=set([“a”,”b”,”c”])
zbior.add(“d”)
print(zbior)
zbior.remove(“a”)
print(zbior)
zbior.discard(“e”)
print(zbior)
zbior.remove(“e”)
>>>
{‘c’, ‘d’, ‘b’, ‘a’}
{‘c’, ‘d’, ‘b’}
{‘c’, ‘d’, ‘b’}
Traceback (most recent call last):
  File “C:\Users\User\OneDrive\Pulpit\A.py”, line 8, in <module>
zbior.remove(“e”)
KeyError: ‘e’

Czyszczenie zbioru ze wszystkich elementów możemy wykonać za pomocą metody ‘clear’.

zbior=set(‘czarymary’)
print(zbior)
zbior1=zbior.clear()
print(zbior, zbior1)
>>>
{‘y’, ‘m’, ‘r’, ‘z’, ‘c’, ‘a’}
set() None

Stosując metodę clear trzeba pamiętać, że trzeba wykonać zapasową kopię zbioru przed instrukcją zbior.clear(), a nie jednocześnie z nią.

Działania na zbiorach

Podstawowe działania na zbiorach są tak samo zdefiniowane jak w matematyce. Są to suma mnogościowa (union, wykonywana w matematyce za pomocą symbolu ∪), iloczyn mnogościowy (intersection, wykonywany w matematyce za pomocą symbolu ∩), różnica mnogościowa wykonywana w matematyce za pomocą zwykłego minusa – lub ukośnego) oraz różnica symetryczna wykonywana za pomocą symbolu minusa z kropką). W Pythonie operacje te wykonuje się za pomocą symboli ‘|’, ‘&’, ‘-‘ i ‘^’.

zbior1=set(‘czarymary’)
zbior2=set(‘abrakadabra’)
print(zbior1, zbior2)
print(“suma mnogościowa “, zbior1 | zbior2)
print(“iloczyn mnogościowy “, zbior1 & zbior2)
print(“różnica mnogościowa “, zbior1 – zbior2)
print(“różnica symetryczna mnogościowa “, zbior1 ^ zbior2)
>>>
{‘r’, ‘y’, ‘c’, ‘z’, ‘m’, ‘a’} {‘r’, ‘d’, ‘k’, ‘a’, ‘b’}
suma mnogościowa {‘r’, ‘y’, ‘d’, ‘k’, ‘c’, ‘z’, ‘m’, ‘a’, ‘b’}
iloczyn mnogościowy {‘r’, ‘a’}
różnica mnogościowa {‘y’, ‘z’, ‘m’, ‘c’}
różnica symetryczna mnogościowa {‘y’, ‘z’, ‘c’, ‘m’, ‘d’, ‘k’, ‘b’}

O ile wynik opisanych działań nie zostanie przypisany jakiemuś literałowi, to nie jest on pamiętany. Aby wynik działania zmieniał na trwale pierwszy (z lewej strony) zbiór należy użyć działań ‘|=’, ‘&=’ , ‘-=’ oraz ‘^=’.

zbior1=set(‘czarymary’)
zbior2=set(‘abrakadabra’)
print(zbior1, zbior2)
zbior1 |= zbior2
print(“suma mnogościowa “, zbior1)
zbior1=set(‘czarymary’)
zbior1 &= zbior2
print(“iloczyn mnogościowy “, zbior1)
zbior1=set(‘czarymary’)
zbior1 -= zbior2
print(“różnica mnogościowa”, zbior1)
zbior1=set(‘czarymary’)
zbior1 ^= zbior2
print(“różnica symetryczna mnogościowa”, zbior1)
>>>
{‘r’, ‘y’, ‘a’, ‘m’, ‘c’, ‘z’} {‘r’, ‘k’, ‘d’, ‘a’, ‘b’}
suma mnogościowa {‘r’, ‘k’, ‘d’, ‘y’, ‘a’, ‘m’, ‘b’, ‘c’, ‘z’}
iloczyn mnogościowy {‘r’, ‘a’}
różnica mnogościowa {‘y’, ‘m’, ‘c’, ‘z’}
różnica symetryczna mnogościowa {‘k’, ‘d’, ‘y’, ‘m’, ‘b’, ‘c’, ‘z’}

 

Relacje między zbiorami

Sprawdzenie, czy zbiory są takie same wykonujemy za pomocą relacji ‘==’ albo ‘is’. Relację ‘is’ można połączyć z negacją ‘not’ i sprawdzać czy zbiory są różne.

zbior1=set(‘abrakadabra’)
zbior2={‘a’,’b’,’c’,’d’,’e’,’k’,’r’}
print(zbior1,zbior2)
print(zbior1==zbior2)
print(zbior1 is zbior2, zbior1 is not zbior2)
>>>
{‘r’, ‘b’, ‘a’, ‘k’, ‘d’} {‘e’, ‘c’, ‘r’, ‘d’, ‘b’, ‘a’, ‘k’}
False
False True

Zastosowanie symboli <, >, <=, >= jest pytaniem o zawieranie się jednego zbioru w drugim. Można je zastąpić metodami issubset, issuperset.

zbior1=set([“a”,”b”,”c”])
zbior2=set([“b”, “c”, “d”])
zbior3=set([“a”,”d”,”b”,”c”])
print(zbior1 < zbior3, zbior1.issubset(zbior3))
print(zbior3 > zbior2, zbior3.issuperset(zbior2))
>>>
True True
True True

 

Metody działające na zbiorach

Metoda add(x) dodaje element x do zbioru.

zbior=set(‘abrakadabra’)
print(zbior)
zbior.add(“czarymary”)
print(zbior)
>>>
{‘r’, ‘a’, ‘k’, ‘d’, ‘b’}
{‘r’, ‘a’, ‘k’, ‘d’, ‘czarymary’, ‘b’}

Dołączanie elementów innego zbioru możemy wykonać za pomocą metody ‘union’ lub ‘update’. Metoda union zastępuje działanie ‘|’ a metoda ‘update’ działanie ‘|=’. Pierwsza z nich nie zmienia pierwszego zbioru, druga zastępuje go sumą zbiorów.

zbior1=set(‘abrakadabra’)
zbior2={‘czarymary’,’hokuspokus’}
print(zbior1, zbior2)
zbior1.union(zbior2)
print(zbior1)
zbior1.update(zbior2)
print(zbior1)
>>>
{‘k’, ‘d’, ‘r’, ‘b’, ‘a’} {‘czarymary’, ‘hokuspokus’}
{‘k’, ‘d’, ‘r’, ‘b’, ‘a’}
{‘k’, ‘d’, ‘czarymary’, ‘hokuspokus’, ‘r’, ‘b’, ‘a’}

Metody intersection i intersection_update zastępują działania ‘&’ oraz ‘&=’ odpowiednio. Wyliczają iloczyn mnogościowy zbiorów, przy czy druga metoda zmienia na trwałe pierwszy ze zbiorów.

zbior1=set(‘abrakadabra’)
zbior2=set(‘czarymary’)
print(zbior1, zbior2)
zbior1.intersection(zbior2)
print(zbior1)
zbior1.intersection_update(zbior2)
print(zbior1)
>>>
{‘k’, ‘d’, ‘b’, ‘r’, ‘a’} {‘c’, ‘y’, ‘m’, ‘z’, ‘r’, ‘a’}
{‘k’, ‘d’, ‘b’, ‘r’, ‘a’}
{‘r’, ‘a’}

Metody difference i difference_update zastępują działania ‘-‘ i ‘-=’ odpowiednio. Wyliczają różnicę mnogościową zbiorów, przy czym pierwsza nie zmienia pierwszego zbioru, druga zmienia go na różnicę.

zbior1=set(‘abrakadabra’)
zbior2=set(‘czarymary’)
print(zbior1, zbior2)
zbior1.difference(zbior2)
print(zbior1)
zbior1.difference_update(zbior2)
print(zbior1)
>>>
{‘r’, ‘k’, ‘d’, ‘a’, ‘b’} {‘m’, ‘c’, ‘r’, ‘y’, ‘z’, ‘a’}
{‘r’, ‘k’, ‘d’, ‘a’, ‘b’}
{‘k’, ‘d’, ‘b’}

Taka sama zasada dotyczy różnicy symetrycznej, dla której stosuje się metody: symmetric_difference (zastępujące działanie ‘^’) oraz symmetric_difference_update (zastępujące działanie ‘^=’).

zbior1=set(‘abrakadabra’)
zbior2=set(‘czarymary’)
print(zbior1, zbior2)
zbior1.symmetric_difference(zbior2)
print(zbior1)
zbior1.symmetric_difference_update(zbior2)
print(zbior1)
>>>
{‘r’, ‘d’, ‘a’, ‘k’, ‘b’} {‘r’, ‘z’, ‘y’, ‘a’, ‘m’, ‘c’}
{‘r’, ‘d’, ‘a’, ‘k’, ‘b’}
{‘z’, ‘y’, ‘d’, ‘m’, ‘c’, ‘k’, ‘b’}

Metoda issubset sprawdza czy zbiór zawiera się w drugim zbiorze. Zbiory sobie równe spełniają ten warunek.

zbior1=set(‘abrakadabra’)
zbior2=set(‘brkdbr’)
zbior3=zbior1 | zbior2
print(zbior1.issubset(zbior2), zbior2.issubset(zbior1), zbior3.issubset(zbior1))
>>>
False True True

Metoda issuperset sprawdza czy zbiór zawiera drugi zbiór. Zbiory sobie równe spełniają ten warunek.

zbior1=set(‘abrakadabra’)
zbior2=set(‘brkdbr’)
zbior3=zbior1 | zbior2
print(zbior1.issuperset(zbior2), zbior2.issuperset(zbior1), zbior3.issuperset(zbior1))
>>>
True False True

Metoda ‘remove(x)’ usuwa element x ze zbioru, o ile się on tam znajduje. W przeciwnym wypadku generuje błąd.

zbior=set(‘abrakadabra’)
print(zbior)
zbior.remove(“a”)
print(zbior)
>>>
{‘b’, ‘r’, ‘d’, ‘k’, ‘a’}
{‘b’, ‘r’, ‘d’, ‘k’}

Metoda discard(x) usuwa element x ze zbioru i nie daje błędu, gdy ten element w zbiorze się nie znajduje.

zbior=set(‘abrakadabra’)
print(zbior)
zbior.discard(“czarymary”)
print(zbior)
>>>
{‘b’, ‘r’, ‘d’, ‘k’, ‘a’}
{‘b’, ‘r’, ‘d’, ‘k’, ‘a’}

Usuwanie dowolnego jednego elementu ze zbioru jest wykonalne za pomocą metody pop(). Element wybierany jest losowo i po powtórzeniach operacji można uzyskać inny wynik.

A=set([“a”,”b”,”c”,”d”])
B=A.pop()
print(A,B)
A=set([“a”,”b”,”c”,”d”])
B=A.pop()
print(A,B)
A=set([“a”,”b”,”c”,”d”])
B=A.pop()
print(A,B)
>>>
{‘a’, ‘b’, ‘c’} d
>>>
{‘d’, ‘b’, ‘c’} a
>>>
{‘c’, ‘a’, ‘d’} b

Metoda clear usuwa wszystkie elementy ze zbioru.

zbior=set(‘abrakadabra’)
print(zbior1)
zbior.clear()
print(zbior1)
>>>
{‘k’, ‘r’, ‘b’, ‘a’, ‘d’}
set()

 

Funkcje działające na zbiorach

Funkcja len() pozwala na obliczenie liczby elementów w zbiorze.

zbior=set(‘abcdefgh’)
print(len(zbior))
>>>
8

Funkcja type() pokaże nam, czy za danym literałem kryje się zbiór, czy inny obiekt.

zbior=set(‘abcdefgh’)
print(type(zbior))
>>>
<class ‘set’>
Spis treści