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’> |