Zbiory (set)

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 24880 razy

Zbiory tworzone są z elementów interowalnych w taki sposób, że w dany zbiorze może znaleźć się tylko jeden element o danej wartości.

Tworzenie zbioru z tekstu

Zbiory można tworzyć z tekstu, ponieważ tekst jest również elementem interowalnym:

zbior = set("Jakiś tam przykładowy tekst") print(zbior)

Wynik działania:

{'p', 'ś', 'y', 'a', 'm', 'ł', ' ', 't', 'w', 'r', 'i', 'J', 'd', 'o', 'k', 'z', 'e', 's'}

Tworzenie zbioru z listy

Zbiory można tworzyć z listy:

lista = ["dziesięć", "dziesięć", 9, 9, "jedenaście", (0, 0)] zbior = set(lista) print(zbior)

Wynik działania:

{'dziesięć', 9, (0, 0), 'jedenaście'}

Łączenie dwóch zbiorów

Za pomocą wewnętrznej metody union:

zbior1 = set("tekst") zbior2 = set("tekst jakiś tam") print(zbior1.union(zbior2))

Wynik działania:

{'j', 's', 'm', 'ś', 'e', 'a', ' ', 'k', 't', 'i'}

Za pomocą operatora |:

zbior1 = set("tekst") zbior2 = set("tekst jakiś tam") print(zbior1 | zbior2)

Część wspólna dwóch zbiorów

Za pomocą wewnętrznej metody intersection:

zbior1 = set("tekst") zbior2 = set("tekst jakiś tam") print(zbior1.intersection(zbior2))

Wynik działania:

{'k', 'e', 't', 's'}

Za pomocą operatora &

zbior1 = set("tekst") zbior2 = set("tekst jakiś tam") print(zbior1 & zbior2)

Różnica dwóch zbiorów

Za pomocą wewnętrznej metody difference:

zbior1 = set("tekst") zbior2 = set("tekst jakiś tam") print(zbior1.difference(zbior2)) print(zbior2.difference(zbior1))

Wynik działania:

set()
{'j', 'ś', 'a', ' ', 'm', 'i'}

Za pomocą operatora -:

zbior1 = set("tekst") zbior2 = set("tekst jakiś tam") print(zbior1 - zbior2) print(zbior2 - zbior1)

Różnica symetryczna dwóch zbiorów

Za pomocą wewnętrznej metody symmetric_difference:

zbior1 = set("tekst") zbior2 = set("tekst jakiś tam") print(zbior1.symmetric_difference(zbior2))

Wynik działania:

{'j', 'm', 'ś', 'a', ' ', 'i'}

Za pomocą operatora ^:

zbior1 = set("tekst") zbior2 = set("tekst jakiś tam") print(zbior1 ^ zbior2)

Różnica symetryczna dwóch zbiorów to taka, gdzie dany element występuje w jednym lub w drugim zbierze, ale nie w obu na raz.

Suma dwóch zbiorów z podstawieniem

Zbiór można zsumować dwa zbiory korzystając z wewnętrznej metody update:

zbior = set("jakiś tam tekst") print(zbior) zbior.update("nowy tekst do zbioru") print(zbior)

Wynik działania:

{'e', 'i', 'a', ' ', 'm', 't', 's', 'k', 'j', 'ś'}
{'e', 'y', 'i', 'a', 'z', ' ', 'r', 'm', 't', 's', 'w', 'o', 'n', 'b', 'k', 'j',
 'u', 'ś', 'd'}

Ten sam efekt można uzyskać znacznie krótszym zapisem, korzystając z operatora |=:

zbior = set("jakiś tam tekst") print(zbior) zbior |= set("nowy tekst do zbioru") print(zbior)

Warto zwrócić uwagę, że przy użyciu operatora |= konieczne było utworzenie zbioru z elementów tekstu za pomocą set, czego nie trzeba było robić przy użyciu metody wewnętrznej update.

Część wspólna dwóch zbiorów z podstawieniem

I znów istnieją dwa sposoby, pierwszy wykorzystuje wewnętrzną metodę intersection_update:

zbior = set("jakiś tam tekst") print(zbior) zbior.intersection_update("nowy tekst do zbioru") print(zbior)

Wynik działania:

{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}
{'e', 'i', 's', 'k', 't', ' '}

Ten sam efekt można uzyskać przy wykorzystaniu operatora &=:

zbior = set("jakiś tam tekst") print(zbior) zbior &= set("nowy tekst do zbioru") print(zbior)

I znów, tak jak uprzednio konieczne było rzutowanie na set.

Część wspólna dwóch zbiorów z podstawieniem

Pierwszy sposób, wykorzystujący wewnętrzną metodę difference_update:

zbior = set("jakiś tam tekst") print(zbior) zbior.difference_update("nowy tekst do zbioru") print(zbior)

Wynik działania:

{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}
{'ś', 'a', 'j', 'm'}

Ten sam wynik można uzyskać przy wykorzystaniu operatora -=:

zbior = set("jakiś tam tekst") print(zbior) zbior -= set("nowy tekst do zbioru") print(zbior)

W tym przypadku również konieczne jest rzutowanie na set.

Różnica symetryczna dwóch zbiorów z podstawieniem

Pierwszy sposób, wykorzystujący wewnętrzną metodę difference_update:

zbior = set("jakiś tam tekst") print(zbior) zbior.symmetric_difference_update("nowy tekst do zbioru") print(zbior)

Wynik działania:

{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}
{'ś', 'z', 'b', 'y', 'u', 'a', 'n', 'j', 'm', 'd', 'o', 'w', 'r'}

Ten sam wynik można uzyskać przy wykorzystaniu operatora ^=:

zbior = set("jakiś tam tekst") print(zbior) zbior ^= set("nowy tekst do zbioru") print(zbior)

W tym przypadku również konieczne jest rzutowanie na set.

Dodawanie pojedynczego elementu do zbioru

Dodawanie elementu do zbioru za pomocą metody wewnętrznej add:

zbior = set("jakiś tam tekst") print(zbior) zbior.add("5") print(zbior)

Wynik działania:

{'ś', 'e', 'i', 's', '5', 'a', 'j', 'k', 'm', 't', ' '}
{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}

Usuwanie pojedynczego elementu zbioru

Pierwszy sposób, za pomocą metody wewnętrznej remove:

zbior = set("jakiś tam tekst") print(zbior) zbior.remove("ś") print(zbior)

Wynik działania:

{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}
{'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}

Metoda remove ma pewną wadę, a mianowicie taką, że gdy dany element nie istnieje w zbiorze generowany jest paskudny kod błędu. Dlatego też, gdy nie ma pewności, czy dany element istnieje w zbiorze lepiej użyć metody discard, która usuwa dany element, jeśli istnieje on w zbiorze:

zbior = set("jakiś tam tekst") print(zbior) zbior.discard("ś") zbior.discard("ś") print(zbior)

Kolejną metodą, która zwraca i usuwa pierwszy element zbioru jest pop:

zbior = set("jakiś tam tekst") print(zbior) print(zbior.pop()) print(zbior)

Wynik działania:

{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}
ś
{'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}

Metoda pop zwraca błąd, jeżeli zbiór jest pusty.

Opróżnianie zbioru za pomocą metody clear:

zbior = set("jakiś tam tekst") print(zbior) zbior.clear() print(zbior)

Wynik działania:

{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}
set()

Kopiowanie zbioru za pomocą metody copy:

zbior = set("jakiś tam tekst") print(zbior) zbior2 = zbior.copy() zbior.clear() print(zbior) print(zbior2)

Wynik działania:

{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}
set()
{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}

Liczba elementów zbioru

Za pomocą funkcji len:

zbior = set("jakiś tam tekst") print(len(zbior))

Wynik działania:

{'ś', 'e', 'i', 's', 'a', 'j', 'k', 'm', 't', ' '}
10

Za pomocą metody wewnętrznej __len__:

zbior = set("jakiś tam tekst") print(zbior.__len__())
Propozycje książek