""" Урок 32. Множества — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/32-sets/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-32.py """ # ==================================================================== # Пример 1. Создание множества и ловушка пустых {} # ==================================================================== numbers_set = {1, 2, 3, 2, 1} print(numbers_set) # {1, 2, 3} print(type(numbers_set)) # empty_set = set() empty_dict = {} print(type(empty_set)) # print(type(empty_dict)) # from_list = set([1, 2, 2, 3]) from_string = set("banana") print(from_list) # {1, 2, 3} print(sorted(from_string)) # ['a', 'b', 'n'] # ==================================================================== # Пример 2. Set comprehension # ==================================================================== squares = {x ** 2 for x in range(-3, 4)} print(sorted(squares)) # [0, 1, 4, 9] words = ["python", "java", "python", "sql", "java"] lengths = {len(w) for w in words} print(sorted(lengths)) # [3, 4, 6] # ==================================================================== # Пример 3. Добавление элементов: add() и update() # ==================================================================== s = {1, 2, 3} s.add(4) print(sorted(s)) # [1, 2, 3, 4] s.add(2) # элемент уже есть print(sorted(s)) # [1, 2, 3, 4] — без изменений s.update([5, 6], {7}) print(sorted(s)) # [1, 2, 3, 4, 5, 6, 7] # ==================================================================== # Пример 4. Удаление: remove(), discard(), pop(), clear() # ==================================================================== s2 = {1, 2, 3, 4, 5} s2.remove(5) print(sorted(s2)) # [1, 2, 3, 4] try: s2.remove(100) except KeyError as e: print(f"KeyError: {e}") # KeyError: 100 s2.discard(100) # тот же отсутствующий элемент, но без ошибки print(sorted(s2)) # [1, 2, 3, 4] popped = s2.pop() print("popped:", popped, "остаток:", sorted(s2)) # popped: 1 остаток: [2, 3, 4] s2.clear() print(s2) # set() # ==================================================================== # Пример 5. Операции над множествами: операторы и одноимённые методы # ==================================================================== set1 = {1, 2, 3} set2 = {2, 3, 4} print(sorted(set1 | set2), sorted(set1.union(set2))) # [1, 2, 3, 4] [1, 2, 3, 4] — объединение: всё из обоих print(sorted(set1 & set2), sorted(set1.intersection(set2))) # [2, 3] [2, 3] — пересечение: только общее print(sorted(set1 - set2), sorted(set1.difference(set2))) # [1] [1] — разность: только в set1 print(sorted(set2 - set1), sorted(set2.difference(set1))) # [4] [4] — разность не симметрична print(sorted(set1 ^ set2), sorted(set1.symmetric_difference(set2))) # [1, 4] [1, 4] — то, что не общее # ==================================================================== # Пример 6. In-place варианты: update(), intersection_update(), difference_update() # ==================================================================== a = {1, 2, 3, 4} b = {3, 4, 5} a_copy = set(a) a_copy.intersection_update(b) print(sorted(a_copy)) # [3, 4] a_copy2 = set(a) a_copy2.difference_update(b) print(sorted(a_copy2)) # [1, 2] a_copy3 = set(a) a_copy3.update(b) print(sorted(a_copy3)) # [1, 2, 3, 4, 5] print("исходное a не тронуто:", sorted(a)) # [1, 2, 3, 4] # ==================================================================== # Пример 7. Отношения множеств: issubset(), issuperset(), isdisjoint() # ==================================================================== set1 = {1, 2, 3} set3 = {1, 2} print(set3.issubset(set1), set3 <= set1) # True True print(set1.issuperset(set3), set1 >= set3) # True True print({5, 6, 7}.isdisjoint({8, 9, 10})) # True — общих элементов нет print({1}.isdisjoint({1, 2, 3})) # False — общий элемент 1 есть print(set1 == {3, 2, 1}) # True — состав одинаковый print(set1 != {2, 3, 4}) # True # ==================================================================== # Пример 8. Хешируемость элементов и frozenset # ==================================================================== print(hash(42)) # 42 print(hash((1, 2, 3))) # число, стабильное в рамках запуска try: hash([1, 2, 3]) except TypeError as e: print(f"TypeError: {e}") # TypeError: unhashable type: 'list' try: bad_set = {[1, 2]} except TypeError as e: print(f"TypeError: {e}") # TypeError: unhashable type: 'list' frozen = frozenset([1, 2, 3]) print(frozen) # frozenset({1, 2, 3}) try: frozen.add(4) except AttributeError as e: print(f"AttributeError: {e}") # AttributeError: 'frozenset' object has no attribute 'add' nested = {frozenset([1, 2]), frozenset([3, 4])} # frozenset хешируем — можно класть в set print(nested) # {frozenset({3, 4}), frozenset({1, 2})} # ==================================================================== # Пример 9. Практика: дедупликация и быстрая проверка «есть ли элемент» # ==================================================================== raw = [3, 1, 2, 3, 1, 4, 2] print(sorted(set(raw))) # [1, 2, 3, 4] visited_ids = {101, 205, 310} print(205 in visited_ids) # True print(999 in visited_ids) # False text = "hello world" unique_chars = set(text) unique_chars.discard(" ") print(sorted(unique_chars)) # ['d', 'e', 'h', 'l', 'o', 'r', 'w'] # ==================================================================== # Пример 10. Границы применимости: порядок не гарантирован, только хешируемое # ==================================================================== demo = {"banana", "apple", "cherry"} print(demo) # порядок вывода не является частью контракта set print(sorted(demo)) # ['apple', 'banana', 'cherry'] — стабильно, если порядок важен list1 = [1, 2, 3, 4, 5] list2 = [3, 4, 5, 6, 7] common = sorted(set(list1) & set(list2)) print(common) # [3, 4, 5]