Historia pytania:
Typ set (zbiór) został dodany w Pythonie 2.4 i zapewnia wygodny i szybki sposób przechowywania unikalnych zmiennych elementów przy wsparciu dla operacji teorii zbiorów (suma, część wspólna itd.). Zbiory są zrealizowane na podstawie tabeli haszującej.
Problem: Wielu użytkowników nie rozumie różnicy między set a list, cech przechowywania elementów w set (brak porządku, tylko obiekty haszowalne), a także niuansów związanych z używaniem zbiorów do optymalizacji wyszukiwania, weryfikacji unikalności lub pracy z dużymi zbiorami danych.
Rozwiązanie:
Set — to zmienny, nieuporządkowany kontener unikalnych obiektów haszowalnych. Wspiera szybkie operacje wyszukiwania przynależności, sumy, części wspólnej, różnicy i różnicy symetrycznej. Wbudowane metody: add, remove, discard, update, intersection, difference, union, symmetric_difference i inne.
Przykład kodu:
nums = {1, 3, 5, 7} nums.add(9) nums.update([5, 10]) # 5 już jest, zostanie dodany tylko 10 other = {3, 9, 11} inter = nums & other # część wspólna {3, 9} # Sprawdzanie przynależności — szybsze niż w list y = 11 if y in nums: print('Jest!')
Kluczowe cechy:
in jest niesamowicie szybka (O(1) w średniej), w przeciwieństwie do listy (O(n)).Czy można dodać listę lub inny set do set?
Odpowiedź: Nie, nie można. Tylko obiekty haszowalne (niemutowalne) są dozwolone: ciągi, liczby, krotki. Listy i zbiory — są mutowalne, nie można ich dodawać.
Przykład kodu:
s = set() s.add([1, 2]) # TypeError: typ unhashable: 'list' s.add((1, 2)) # OK
Czym różni się metoda remove od discard w set?
Odpowiedź: remove(value) zgłasza wyjątek KeyError, jeśli value nie zostało znalezione. discard(value) cicho nic nie robi, jeśli takiego elementu nie ma.
Przykład kodu:
s = {1, 2, 3} s.remove(4) # KeyError s.discard(4) # Brak błędu
Czy pusty zbiór {} jest obiektem set?
Odpowiedź: Nie. Literat {} zawsze jest pustym dict. Aby stworzyć pusty set, należy użyć funkcji set().
Przykład kodu:
empty_set = {} # To dict empty_set_real = set() # To set
Negatywny przypadek
Próbują przechowywać unikalne obiekty w liście i sprawdzać przez "in" w celu wyszukiwania duplikatów przy dużych objętościach danych.
Zalety:
Wady:
Pozytywny przypadek
Używają set do wyszukiwania części wspólnych i unikalnych danych w dużych zbiorach (na przykład w e-mailach), nie pojawiają się duplikaty, a operacja zachodzi szybko.
Zalety:
Wady: