""" Урок 34. Словари, frozenset — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/34-dictionaries-frozenset/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-34.py """ # ==================================================================== # Пример 1. Set comprehension: та же идея, что list comprehension # ==================================================================== # set_comprehension.py words = ["apple", "banana", "cherry", "apple"] unique_lengths = {len(word) for word in words} print(unique_lengths) # {5, 6} vowels_used = {ch for word in words for ch in word if ch in "aeiou"} print(sorted(vowels_used)) # ['a', 'e'] # ==================================================================== # Пример 2. frozenset — множество, которое нельзя изменить # ==================================================================== # frozenset_immutable.py immutable_set = frozenset([1, 2, 3, 4, 5]) print(immutable_set) # frozenset({1, 2, 3, 4, 5}) print(immutable_set | frozenset([4, 5, 6])) # frozenset({1, 2, 3, 4, 5, 6}) try: immutable_set.add(6) except AttributeError as error: print("AttributeError:", error) # 'frozenset' object has no attribute 'add' # ==================================================================== # Пример 3. frozenset как ключ словаря или элемент множества # ==================================================================== # frozenset_as_key.py permissions = { frozenset(["read"]): "viewer", frozenset(["read", "write"]): "editor", } current_permissions = frozenset(["write", "read"]) print(permissions[current_permissions]) # editor print(len({frozenset([1, 2]), frozenset([2, 1]), frozenset([3])})) # 2 # ==================================================================== # Пример 4. Создание словаря и требование к хешируемости ключа # ==================================================================== # dict_creation.py person = dict(name="Alice", age=30, city="New York") print(person) # {'name': 'Alice', 'age': 30, 'city': 'New York'} pairs = [("name", "Charlie"), ("age", 35), ("city", "Paris")] person2 = dict(pairs) print(person2["name"]) # Charlie same_key = {1.0: "float", 1: "integer", True: "boolean"} print(same_key) # {1.0: 'boolean'} try: bad = {[1, 2]: "list key"} except TypeError as error: print("TypeError:", error) # unhashable type: 'list' # ==================================================================== # Пример 5. Доступ по ключу: [], get() и in # ==================================================================== # access_by_key.py person = {"name": "Alice", "age": 30} try: print(person["city"]) except KeyError as error: print("KeyError:", error) # 'city' print(person.get("city")) # None print(person.get("city", "не указан")) # не указан print("city" in person) # False if "name" in person: print(person["name"]) # Alice # ==================================================================== # Пример 6. Добавление и обновление: [] = и update() # ==================================================================== # add_and_update.py user = {"name": "Alice", "age": 30} user["city"] = "New York" # новый ключ — добавлен user.update({"age": 32, "country": "USA"}) # существующий — перезаписан print(user) # {'name': 'Alice', 'age': 32, 'city': 'New York', 'country': 'USA'} user.update(age=33, phone="000") # update() тоже принимает именованные аргументы print(user) # {'name': 'Alice', 'age': 33, 'city': 'New York', 'country': 'USA', 'phone': '000'} # ==================================================================== # Пример 7. Удаление: del, pop(), popitem(), setdefault() # ==================================================================== # remove_from_dict.py user = {"name": "Alice", "age": 30, "city": "New York"} age = user.pop("age") print(age, user) # 30 {'name': 'Alice', 'city': 'New York'} del user["city"] print(user) # {'name': 'Alice'} d = {"a": 1, "b": 2, "c": 3} print(d.popitem()) # ('c', 3) — в современном Python удаляется последняя добавленная пара print(d) # {'a': 1, 'b': 2} d2 = {"x": 1} d2.setdefault("x", 100) # ключ уже есть — значение не меняется d2.setdefault("y", 200) # ключа нет — добавляется со значением по умолчанию print(d2) # {'x': 1, 'y': 200} # ==================================================================== # Пример 8. Инверсия словаря и группировка по ключу # ==================================================================== # invert_and_group.py original_dict = {"a": 1, "b": 2, "c": 3} inverted_dict = {v: k for k, v in original_dict.items()} print(inverted_dict) # {1: 'a', 2: 'b', 3: 'c'} users = { "alice": ["read", "write"], "bob": ["write", "read"], "charlie": ["read"], } groups = {} for user_name, perms in users.items(): key = frozenset(perms) groups.setdefault(key, []).append(user_name) print(groups) # {frozenset({'write', 'read'}): ['alice', 'bob'], frozenset({'read'}): ['charlie']} # — порядок элементов внутри frozenset не гарантирован, у вас может быть другим # ==================================================================== # Пример 9. Перебор словаря: ключи, значения, пары, сортировка # ==================================================================== # iterate_dict.py prices = {"banana": 30, "apple": 80, "cherry": 200} for k in prices: # перебор словаря даёт ключи print(k, end=" ") print() # banana apple cherry print(list(prices.keys())) # ['banana', 'apple', 'cherry'] print(list(prices.values())) # [30, 80, 200] for name, price in sorted(prices.items(), key=lambda item: item[1]): print(name, price) # banana 30 # apple 80 # cherry 200 # ==================================================================== # Пример 10. dict как множество: сравнение и общие ключи # ==================================================================== # dict_as_set.py d1 = {"a": 1, "b": 2} d2 = {"a": 1, "b": 2, "c": 3} print(all(item in d2.items() for item in d1.items())) # True — способ из теории print(set(d1) <= set(d2)) # True — через set() print(d1.items() <= d2.items()) # True — напрямую, короче common = d1.keys() & d2.keys() print(sorted(common)) # ['a', 'b']