W niniejszym materiale z nauki Pythona pokażę Ci jedną ze struktur danych jakimi możesz się posłużyć do swoich programów 👀! W języku Python pomiędzy listą, krotką i słownikiem, występuje też zbiór! Przedstawię Ci jego definicję, budowę w kodzie oraz w jakich przypadkach najlepiej będzie go użyć spośród pozostałych! Zapraszam 😊!
DOWIEDZ SIĘ CZYM JEST ZBIÓR W JĘZYKU PYTHON!
Zacznijmy od samego określenia "zbiór", bo jest parę innych struktur danych zdolnych do składowania wielu elementów w jednym miejscu i one też mają zdolność do ich "gromadzenia" 🙂.
Czym jest zbiór w języku Python?
W Pythonie, zbiór (ang. set) jest strukturą danych, która pozwala przechowywać wiele różnych wartości w jednym miejscu, dokładnie tak jak lista. Natomiast charakteryzuje się trzema ważnymi różnicami 👇:
- elementy są niemodyfikowalne (można dodawać i usuwać ze zbioru, lecz nie można modyfikować ich samych),
- elementy nie są sortowane według kolejności ich dodawania (przy każdorazowym dodaniu/usunięciu, ich kolejność może być przypadkowa),
- elementy powtarzające się (duplikaty) nie są brane pod uwagę (po prostu nie zostaną dodane).
Jeżeli kiedykolwiek się zastanawiałeś(-aś) co takiego zawiera w sobie zbiór, czego nie posiada lista, to to są te 3 czynniki.
Przy każdej próbie dodania nowego elementu, zbiór przegląda swoją aktualną zawartość i sprawdza czy już nie zawiera w sobie elementu o tej samej treści. Wówczas może zaistnieć jeden z dwóch scenariuszy 👇:
- element jest dodawany do zbioru po upewnieniu się, że nie znajduje się taki sam w zbiorze,
- element jest ignorowany po stwierdzeniu, że którykolwiek jest identyczny.
Aby dać Ci szansę to sobie wyobrazić, dajmy na to, że elementami są liczby całkowite (bez ułamka) i zbiór posiada w sobie liczbę 3. Gdy zechcemy do zbioru dodać ponownie liczbę 3, to nie zostanie to zrealizowane, ponieważ obie te liczby są sobie równe.
Temat badania "równości elementów" jest w rzeczywistości bardzo zawiły, ponieważ dotyczy on również tych typów danych, przy których możemy nie być w stanie sobie wyobrazić porównywania do siebie elementów, tak jak ma to miejsce przy liczbach. Dotyczy to szczególnie obiektów powstałych z naszych niestandardowych klas, ponieważ każdy z nich może mieć inne wartości i wtedy musimy sami ustalić jakimi czynniki ma się kierować zbiór, aby mógł stwierdzić, że oba obiekty są sobie "równe". To już bardziej zaawansowane zagadnienie, które zostawimy sobie na odrębny artykuł ℹ️.
Kolejnym punktem jest najlepsze zastosowanie struktury zbioru!
Kiedy lepiej użyć zbioru w języku Python, zamiast listy?
Najlepiej w sytuacjach, gdy potrzebujesz uzyskać zestaw takich elementów, które nie będą się powtarzać. Często dotyczy to pobierania danych z jakiegoś źródła (np. z plików czy zasobów internetowych), w których nie występuje żadna filtracja danych. Właśnie wtedy zbiór będzie idealny do otrzymywania zestawienia takich elementów, które będą charakteryzować się pojedynczym wystąpieniem.
Zbiory wyróżniają się też efektywnym (od strony obliczeniowej) wykonywaniem operacji na elementach i zawierają metody do przeprowadzania operacji zbiorów znanych z matematyki, jak np. iloczyn zbiorów ❤️! Używając specjalnej techniki do nadawania elementom tzw. "kodów mieszających" (ang. hashing), są w stanie zapewnić ekspresowe działanie na elementach!
Tak brzmi część teoretyczna, a teraz pokażę zbiór od strony kodu!
Jak utworzyć zbiór w języku Python?
Mamy 2 sposoby utworzenia nowego zbioru w języku Python 👇:
- stworzenie pustego zbioru (tu jest pułapka co do zapisu!),
- stworzenie zbioru zawierającego elementy.
Gdy chcemy mieć na samym początku zbiór bez żadnych elementów, to w tym przypadku wyjątkowo nie możemy użyć symbolu, którym się wyróżnia (klamerki) 👇:
my_set = {}ponieważ Python uzna to za słownik 💥! Słownik ma takie samo oznaczenie jak zbiór i dlatego próba późniejszego operowania na takim zapisie skończy się zgłaszaniem błędów przez Pythona, bo będzie interpretował to jako słownik ❌!
Musimy skorzystać z konstruktora zbiorów, "set" 👇:
my_set = set()Wtedy będziemy mieli gwarancję, że tworzymy zbiór 🙂.
W sytuacji, gdy zbiór ma od samego początku mieć jakiekolwiek elementy, to to obejście już nie jest potrzebne. Po prostu piszemy tak jak zwykle 👇:
my_set = {1, 2, 3}To jest zbiór 3-elementowy, a każdy z elementów jest liczbą całkowitą (bez ułamka) ✅.
A teraz popatrz na taki zbiór 👇:
my_set = {1, 2, 2, 3, 3}Czy już teraz potrafisz odpowiedzieć ile naprawdę będzie miał w sobie elementów? Liczba 2 pojawia się dwa razy i liczba 3 także pojawia się dwukrotnie! Zatem, zbiór ostatecznie będzie mieć 3 elementy (jedna "dwójka" i "trójka" zostaną wykluczone) ⚠️!
Tak jak przy każdej innej strukturze, w Pythonie możesz swobodnie łączyć różne typy danych i umieszczać je w jednym zbiorze 👇:
my_set = {1, 'Mój łańcuch znaków', 3.5}natomiast zwracam uwagę, że wtedy obsługa takiego zbioru w pętli "for" stanie się dużo bardziej kłopotliwa z uwagi na weryfikowanie typu u każdego z elementów. Dlatego też lepiej ograniczać się do jednego typu danych na zbiór 👍.
Do zbioru możemy też wstawiać (jak i usuwać) elementy już po jego dodaniu. W dalszej części materiału zaprezentuję jak się to robi 😉.
Zbiór w języku Python to nieuporządkowana struktura danych, która pilnuje aby wśród wszystkich elementów nie znalazł się duplikat.
Kolejnym rozdziałem poznawania zbiorów jest pobieranie elementów ↩️!
Jak pobierać elementy ze zbioru w języku Python?
Zbiór w Pythonie nie zapamiętuje w żaden sposób kolejności elementów jakie w sobie zawiera, stąd też nie mamy do nich żadnego bezpośredniego dostępu jak w listach 🔒! Zbiory są tak skonstruowane, że ich zadaniem jest tylko zabezpieczenie przed powtórzeniami i nie zważają na to, w jakiej kolejności są te dane. Dlatego też nie możemy się do nich odwoływać wskazując konkretnie o który element nam chodzi, ponieważ ich kolejność jest "chwiejna".
Istnieją pewne sposoby na pobieranie elementów, aczkolwiek są to metody, które wykraczają poza możliwości samego zbioru i wymagają użycia odrębnych konstrukcji np. konwersja na listę, przeszukanie z użyciem pętli "for" lub skorzystanie z iteratora.
Teraz pokażę kolejną ważną kwestię: wyznaczanie liczby elementów w zbiorze 🚀!
Jak wyznaczyć liczbę elementów w zbiorze w języku Python?
Korzystamy dokładnie z tej samej funkcji, która wyznacza liczbę elementów w każdej innej strukturze danych w tym języku: "len" 😄! Wstawiając w miejsce jej jedynego parametru zbiór 👇:
print(len(my_set))otrzymamy wartość 3, bo dokładnie tyle elementów znajduje się w podanym u góry zbiorze!
Czas poznać przykładowe metody na zbiorach w Pythonie!
Jakie metody posiada zbiór w języku Python?
W Pythonie, struktura danych typu "zbiór" zawiera w sobie między innymi następujące metody 👇:
- add,
- pop,
- clear,
- remove.
Więcej metod możesz znaleźć w oficjalnej dokumentacji Pythona 📖, a my skupimy się na wyżej wymienionych 😊.
add
"add" mówi samo za siebie: to jest dodawanie elementu do zbioru 😉! Przydaje się, gdy zamierzamy wstawić element do zbioru, natomiast da się to zrobić dopiero w późniejszym etapie, niż ma miejsce utworzenie samego zbioru 💡.
To jest przykład użycia 👇:
my_set.add(10)Przypominam, że to jest zbiór i zwraca uwagę na identyczność elementów 👀. Jeżeli element nie powtarza się, to zostanie dodany do zbioru ✔️. Jeżeli okaże się, że już taki element znajduje się w zbiorze, to nic się nie wydarzy (nie będzie żadnego komunikatu).
Pamiętaj też o tym, że potem nie wiadomo jaka będzie kolejność wszystkich elementów po dodaniu następnego ⚠️!
Metoda "add" dodaje wskazany element do zbioru, po zweryfikowaniu że taki sam już nie znajduje się w zbiorze.
Teraz kolejna metoda!
pop
"pop" mimo nazwy, która może Ci się kojarzyć z usuwaniem i zwracaniem elementu ostatniego w kolejności, to w tym przypadku usuwa i zwraca LOSOWY element 😱! Zbiór jest nieuporządkowaną strukturą danych, zatem elementy są gromadzone jak monety w sakiewce i nigdy nie wiesz którą wyjmiesz sięgając do środka 💥.
Oto w jaki sposób korzystamy z metody "pop" 👇:
random_element = my_set.pop()
print(random_element)Zwykle przypisujemy element do zmiennej, gdy pobieramy go ze struktury danych 😃. To spowoduje wylosowanie elementu, usunięcie go ze zbioru i zwrócenie go przez funkcję. Zbiór zostanie pomniejszony o ten element, natomiast nie wiadomo jaki to będzie i to trzeba mieć na uwadze ⚠️.
Jeżeli wywołujemy metodę na pustym zbiorze, to Python zgłosi błąd typu "KeyError" i przestanie wykonywać dalszy ciąg programu, jeśli nie przechwytujemy wyjątku 🚫!
Metoda "pop" wybiera losowy element ze zbioru, usuwa go stamtąd i zwraca go na wyjściu. Jeżeli zbiór jest pusty, to powstaje awaria programu!
Przechodzimy do następnej metody!
clear
"clear" dosłownie "czyści" zbiór ze wszystkich elementów sprawiając, że staje się pusty. Wywołanie metody jest proste i oczywiste 👇:
my_set.clear()Nie przyjmując żadnych parametrów, usuwa wszystkie elementy ze zbioru. A jak już jest pusty, to nic się nie dzieje.
Metoda "clear" usuwa wszystkie elementy znajdujące się w zbiorze.
Tyle w temacie, więc teraz ostatnia metoda ze wszystkich wymienionych!
remove
"remove" odpowiada za usunięcie wskazanego elementu ze zbioru ❌. Podając w parametrze element który chcesz usunąć, zostanie on stamtąd zdjęty po upewnieniu się, że faktycznie znajduje się w zbiorze. Jeżeli go nie ma, to ku zaskoczeniu Python zgłosi błąd typu "KeyError", a program zostanie natychmiast przerwany jak nie przechwytujemy wyjątku 🚫!
To jest przykład wywołania 👇:
my_set.remove(2)Liczba 2, jeżeli znajduje się w zbiorze, zostanie usunięta ze zbioru i zauważ, że nie ma zwracania go na wyjściu, zatem znika on bezpowrotnie 💥!
Metoda "remove" usuwa wskazany element ze zbioru. W sytuacji, gdy element nie występuje w zbiorze, program zostaje przerwany!
Wszystko na temat zbiorów w Pythonie co warto wiedzieć 😉. One są bardzo podchwytliwe i mogą sprawiać trudności podczas pierwszego użycia, natomiast przydają się tam, gdzie trzeba za najważniejszy punkt postawić gwarancję niepowtarzalności elementów!