Zbiory (set)

Stronę tą wyświetlono już: 217 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:

Listing 1
  1. zbior = set("Jakiś tam przykładowy tekst")
  2. 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:

Listing 2
  1. lista = ["dziesięć", "dziesięć", 9, 9, "jedenaście", (0, 0)]
  2. zbior = set(lista)
  3. print(zbior)

Wynik działania:

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

Łączenie dwóch zbiorów

Za pomocą wewnętrznej metody union:

Listing 3
  1. zbior1 = set("tekst")
  2. zbior2 = set("tekst jakiś tam")
  3. print(zbior1.union(zbior2))

Wynik działania:

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

Za pomocą operatora |:

Listing 4
  1. zbior1 = set("tekst")
  2. zbior2 = set("tekst jakiś tam")
  3. print(zbior1 | zbior2)

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

Za pomocą wewnętrznej metody intersection:

Listing 5
  1. zbior1 = set("tekst")
  2. zbior2 = set("tekst jakiś tam")
  3. print(zbior1.intersection(zbior2))

Wynik działania:

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

Za pomocą operatora &

Listing 6
  1. zbior1 = set("tekst")
  2. zbior2 = set("tekst jakiś tam")
  3. print(zbior1 & zbior2)

Różnica dwóch zbiorów

Za pomocą wewnętrznej metody difference:

Listing 7
  1. zbior1 = set("tekst")
  2. zbior2 = set("tekst jakiś tam")
  3. print(zbior1.difference(zbior2))
  4. print(zbior2.difference(zbior1))

Wynik działania:

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

Za pomocą operatora -:

Listing 8
  1. zbior1 = set("tekst")
  2. zbior2 = set("tekst jakiś tam")
  3. print(zbior1 - zbior2)
  4. print(zbior2 - zbior1)

Różnica symetryczna dwóch zbiorów

Za pomocą wewnętrznej metody symmetric_difference:

Listing 9
  1. zbior1 = set("tekst")
  2. zbior2 = set("tekst jakiś tam")
  3. print(zbior1.symmetric_difference(zbior2))

Wynik działania:

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

Za pomocą operatora ^:

Listing 10
  1. zbior1 = set("tekst")
  2. zbior2 = set("tekst jakiś tam")
  3. 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:

Listing 11
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior.update("nowy tekst do zbioru")
  4. 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 |=:

Listing 12
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior |= set("nowy tekst do zbioru")
  4. 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:

Listing 13
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior.intersection_update("nowy tekst do zbioru")
  4. 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 &=:

Listing 14
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior &= set("nowy tekst do zbioru")
  4. 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:

Listing 15
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior.difference_update("nowy tekst do zbioru")
  4. 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 -=:

Listing 16
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior -= set("nowy tekst do zbioru")
  4. 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:

Listing 17
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior.symmetric_difference_update("nowy tekst do zbioru")
  4. 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 ^=:

Listing 18
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior ^= set("nowy tekst do zbioru")
  4. 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:

Listing 19
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior.add("5")
  4. 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:

Listing 20
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior.remove("ś")
  4. 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:

Listing 21
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior.discard("ś")
  4. zbior.discard("ś")
  5. print(zbior)

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

Listing 22
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. print(zbior.pop())
  4. 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:

Listing 23
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior.clear()
  4. print(zbior)

Wynik działania:

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

Kopiowanie zbioru za pomocą metody copy:

Listing 24
  1. zbior = set("jakiś tam tekst")
  2. print(zbior)
  3. zbior2 = zbior.copy()
  4. zbior.clear()
  5. print(zbior)
  6. 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:

Listing 25
  1. zbior = set("jakiś tam tekst")
  2. print(len(zbior))

Wynik działania:

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

Za pomocą metody wewnętrznej __len__:

Listing 26
  1. zbior = set("jakiś tam tekst")
  2. print(zbior.__len__())

Komentarze