Работа со словарями в Python

Словарь в Python — это изменяемая и неупорядоченная коллекция данных, представленная в виде пар «ключ-значение».

В отличие от списков, которые индексируются целыми числами, словари позволяют использовать любые неизменяемые объекты в качестве ключей, такие как строки, числа и кортежи.

Пример создания словаря:

# Пустой словарь
my_dict = {}

# Словарь с данными
student = {
    'имя': 'Иван',
    'возраст': 20,
    'курс': 2,
    'оценки': [85, 90, 78]
}

Почему словари важны?

  • Гибкость:
    • Словари позволяют организовать данные более гибко, чем обычные последовательности.
  • Использование ключей:
    • Ключи словарей позволяют эффективно идентифицировать и получать доступ к значениям.
  • Удобство хранения и обработки данных:
    • Словари предоставляют удобные методы для добавления, изменения и удаления данных.

Пример использования словаря:

# Доступ к данным по ключу
print(student['имя'])  # Вывод: Иван

# Изменение значения по ключу
student['возраст'] = 21

# Добавление нового элемента
student['предметы'] = ['математика', 'физика']

# Вывод ключей и значений
print(student.keys())    # Вывод: dict_keys(['имя', 'возраст', 'курс', 'оценки', 'предметы'])
print(student.values())  # Вывод: dict_values(['Иван', 21, 2, [85, 90, 78], ['математика', 'физика']])

Какие задачи наиболее эффективно можно решить именно с помощью словарей?

Словари в Python предоставляют множество возможностей для эффективного решения различных задач.

  1. Сопоставление данных:
    • Пример: Хранение информации о студентах с использованием их имен в качестве ключей и данных (например, возраст, оценки) в качестве значений.
  2. Индексация и быстрый доступ:
    • Пример: Использование словаря для индексации данных по уникальному идентификатору, что позволяет быстро получать доступ к нужным значениям.
  3. Группировка данных:
    • Пример: Сохранение данных в словаре в виде групп, где каждая группа представлена ключом, а связанные с ней данные — значениями.
  4. Счетчики и подсчет элементов:
    • Пример: Подсчет частоты встречаемости элементов в последовательности, где ключи — элементы, а значения — количество их появлений.
  5. Кеширование результатов:
    • Пример: Сохранение результатов выполнения дорогостоящих операций в словаре для избежания повторных вычислений при одинаковых входных данных.
  6. Создание конфигураций и параметров:
    • Пример: Хранение настроек программы в словаре для удобного доступа и изменения параметров.
  7. Сопоставление справочной информации:
    • Пример: Создание справочника, где ключи — термины, а значения — их определения или связанные данные.
  8. Фильтрация и поиск данных:
    • Пример: Использование словарей для фильтрации данных по определенному критерию, что может быть полезно при анализе данных.

Способы создания словарей

  1. Вручную:
    • Простейший способ создания словаря — вручную указать ключи и соответствующие значения в фигурных скобках.
      student = {'имя': 'Иван', 'возраст': 20, 'курс': 2}
      
  2. Через функцию dict():
    • Можно создавать словари, используя встроенную функцию dict(). Это особенно удобно, когда у вас есть последовательности ключей и значений.
      student = dict(имя='Иван', возраст=20, курс=2)
      
  3. С использованием генератора:
    • Генераторы словарей предоставляют компактный способ создания словарей с использованием выражения в фигурных скобках.
      squares = {x: x**2 for x in range(1, 6)}
      # Вывод: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
      
  4. С использованием функции zip():
    • Функция zip() позволяет объединять две последовательности в кортежи, которые затем можно использовать для создания словаря.
      keys = ['a', 'b', 'c']
      values = [1, 2, 3]
      my_dict = dict(zip(keys, values))
      # Вывод: {'a': 1, 'b': 2, 'c': 3}
      
  5. С помощью метода fromkeys():
    • Метод fromkeys() создает новый словарь с заданными ключами и начальным значением (по умолчанию None).
      keys = ['a', 'b', 'c']
      my_dict = dict.fromkeys(keys, 0)
      # Вывод: {'a': 0, 'b': 0, 'c': 0}
      
  6. С использованием конструктора dict():
    • Конструктор dict() может принимать различные формы входных данных, такие как другой словарь или последовательности кортежей.
      pairs = [('a', 1), ('b', 2), ('c', 3)]
      my_dict = dict(pairs)
      # Вывод: {'a': 1, 'b': 2, 'c': 3}
      

Задания для тренировки на создание словарей.

Задание 1. Простое создание словаря: Создайте словарь, представляющий информацию о вашем друге. Включите ключи «имя», «возраст» и «хобби».

Задание 2. Создание словаря из двух списков: У вас есть два списка: один с именами студентов, другой с их оценками. Создайте словарь, используя имена в качестве ключей и оценки в качестве значений.

Задание 3. Генерация словаря с квадратами чисел: Используя генератор словаря, создайте словарь, где ключи — числа от 1 до 5, а значения — их квадраты.

Задание 4. Объединение двух списков в словарь: У вас есть два списка, один с названиями предметов, другой с оценками. Создайте словарь, где предметы будут ключами, а оценки — значениями. Если предмету не соответствует оценка, используйте значение None.

Задание 5. Создание словаря из текстовых данных: У вас есть текстовый файл с данными в формате «ключ: значение». Создайте словарь, считав данные из файла. Учтите, что значения могут быть числами или строками.

Решения
# Задание 1
friend_info = {'имя': 'Анна', 'возраст': 25, 'хобби': 'фотография'}
# Вывод: {'имя': 'Анна', 'возраст': 25, 'хобби': 'фотография'}

# Задание 2
students = ['Иван', 'Мария', 'Петр']
grades = [85, 90, 78]
grades_dict = dict(zip(students, grades))
# Вывод: {'Иван': 85, 'Мария': 90, 'Петр': 78}

# Задание 3
squares_dict = {x: x**2 for x in range(1, 6)}
# Вывод: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# Задание 4
subjects = ['Математика', 'Физика', 'Химия']
grades = [92, 88, 95]
grades_dict = dict.fromkeys(subjects, None)
grades_dict.update(zip(subjects, grades))
# Вывод: {'Математика': 92, 'Физика': 88, 'Химия': 95}

# Задание 5
with open('data.txt', 'r') as file:
    data = file.readlines()

data_dict = {}
for line in data:
    key, value = line.strip().split(': ')
    data_dict[key] = int(value) if value.isdigit() else value
# Вывод: {'name': 'John', 'age': 30, 'city': 'New York'}

Изменяемые и неизменяемые типы данных

В языке программирования Python типы данных делятся на изменяемые (mutable) и неизменяемые (immutable). Это свойство определяет, может ли объект изменять свое состояние после создания.

Неизменяемые типы данных:

  1. int (целые числа):
    • Пример: x = 5
  2. float (вещественные числа):
    • Пример: y = 3.14
  3. str (строки):
    • Пример: text = "Hello"
  4. tuple (кортежи):
    • Пример: coordinates = (1, 2)
  5. frozenset (неизменяемое множество):
    • Пример: frozen_set = frozenset([1, 2, 3])
  6. bool (логический тип данных):
    • Пример: flag = True

Неизменяемые объекты не могут быть изменены после создания. Если, например, вы присваиваете новое значение переменной типа int, создается новый объект.

Изменяемые типы данных:

  1. list (списки):
    • Пример: my_list = [1, 2, 3]
  2. dict (словари):
    • Пример: my_dict = {'a': 1, 'b': 2}
  3. set (множества):
    • Пример: my_set = {1, 2, 3}
  4. bytearray (изменяемый массив байтов):
    • Пример: byte_array = bytearray([65, 66, 67])
  5. byte (байтовая строка):
    • Пример: byte_string = b"hello"
  6. array (массивы):
    • Пример: from array import array; my_array = array('i', [1, 2, 3])
  7. custom objects с возможностью изменения:
    • Пример: class MyClass: pass; obj = MyClass()

Изменяемые объекты могут изменять свое состояние после создания. Например, при изменении значения в списке, объект списка остается тем же, и изменения видны повсюду, где используется этот список.

Хэширование в Python

Хеширование в Python связано с использованием хэш-функций для преобразования объектов в числовые значения, называемые хеш-кодами. Хеш-коды используются, например, для быстрого поиска в словарях или множествах. Однако не все объекты могут быть хэшированы в Python. Рассмотрим, какие объекты можно и нельзя хэшировать:

Объекты, которые МОЖНО хэшировать:

  1. Неизменяемые (immutable) типы данных:
    • int: hash(42)
    • float: hash(3.14)
    • str: hash("hello")
    • tuple: hash((1, 2, 3))
    • frozenset: hash(frozenset([1, 2, 3]))
  2. Объекты с пользовательским методом __hash__:
    • Если пользователь явно определил метод __hash__ в своем объекте, то этот объект может быть хэширован.

Объекты, которые НЕЛЬЗЯ хэшировать:

  1. Изменяемые (mutable) типы данных:
    • list: hash([1, 2, 3])
    • set: hash({1, 2, 3})
    • dict: hash({'a': 1, 'b': 2})
  2. Объекты без определенного метода __hash__ и __eq__:
    • Если объект не имеет явно определенных методов __hash__ и __eq__, то он не может быть хэширован. Например, пользовательский класс без определения этих методов.
  3. Объекты с изменяемыми состояниями после создания:
    • Если объект изменяется после создания (например, имеет изменяемое состояние), то он не может быть хэширован. Это касается, например, списков, множеств и словарей.
  4. Объекты с методом __hash__, но без метода __eq__:
    • Хотя объект с методом __hash__ может быть хэширован, это может привести к проблемам, если не определен метод __eq__ (сравнение), поскольку хэширование предполагает равенство.
      # Пример пользовательского класса с определенным методом __hash__
      class CustomHashable:
          def __init__(self, value):
              self.value = value
      
          def __hash__(self):
              return hash(self.value)
      
      # Пример объектов, которые можно и нельзя хэшировать
      hashable_obj = CustomHashable(42)  # Можно хэшировать
      unhashable_list = [1, 2, 3]        # Нельзя хэшировать
      

Можно ли хэшировать кортеж с элементами изменяемых типов, например, списками?

Кортежи в Python являются неизменяемыми (immutable) структурами данных, и в целом их можно хэшировать, если они содержат элементы, которые сами по себе можно хэшировать.

Однако, если кортеж содержит изменяемые объекты, такие как списки, он становится немедленно нехэшируемым!

Вот пример:

# Кортеж с элементами изменяемого типа (списки)
tuple_with_lists = ([1, 2], [3, 4])

# Попытка хэширования приведет к ошибке TypeError
try:
    hash(tuple_with_lists)
except TypeError as e:
    print(f"Ошибка: {e}")

В данном примере, попытка хэширования tuple_with_lists вызовет TypeError, поскольку кортеж содержит списки, которые являются изменяемыми объектами.

Какие типы данных могут быть ключами у словарей?

В Python ключами словарей могут быть любые неизменяемые (immutable) объекты. Это обусловлено тем, что словари используют хэширование для эффективного поиска значений по ключу. Неизменяемость объекта гарантирует, что его хеш-код (hash) остается неизменным, что важно для корректной работы словарей.

Вот некоторые типы данных, которые могут быть использованы в качестве ключей в словарях:

  1. int (целые числа)
  2. float (вещественные числа)
  3. str (строки)
  4. tuple (кортежи) с элементами, которые сами по себе неизменяемы
  5. frozenset (неизменяемые множества)
  6. bool (логический тип данных)
  7. bytes (байтовые строки)
  8. None (пустой объект)
  9. custom objects с определенным методом __hash__:
    class CustomHashable:
        def __init__(self, value):
            self.value = value
    
        def __hash__(self):
            return hash(self.value)
    
    obj = CustomHashable(42)
    my_dict = {obj: "value"}
    

Операции со словарями в Python:

  1. Доступ к значениям по ключу:
    • Используйте ключ для получения значения из словаря. Если ключ не существует, возникает ошибка.
      student = {'имя': 'Иван', 'возраст': 20, 'курс': 2}
      name = student['имя']
      # Вывод: 'Иван'
      
  2. Изменение значений по ключу:
    • Просто присвойте новое значение существующему ключу.
      student['возраст'] = 21
      # Теперь словарь выглядит так: {'имя': 'Иван', 'возраст': 21, 'курс': 2}
      
  3. Удаление элементов:
    • Используйте ключ для удаления элемента из словаря с помощью оператора del.
      del student['курс']
      # Теперь словарь выглядит так: {'имя': 'Иван', 'возраст': 21}
      
  4. Проверка наличия ключа в словаре:
    • Используйте оператор in для проверки наличия ключа в словаре.
      has_age = 'возраст' in student
      # Вывод: True
      
  5. Безопасное получение значения по ключу с методом get():
    • Метод get() позволяет получить значение по ключу, и если ключ отсутствует, возвращает значение по умолчанию (или None, если не указано).
      age = student.get('возраст', 'Неизвестно')
      # Вывод: 21
      
  6. Методы keys(), values(), items():
    • keys(): Возвращает список всех ключей в словаре.
    • values(): Возвращает список всех значений в словаре.
    • items(): Возвращает список кортежей (ключ, значение) в словаре.
      keys_list = student.keys()
      values_list = student.values()
      items_list = student.items()
      
  7. Метод pop():
    • Метод pop(key) удаляет элемент с указанным ключом и возвращает его значение.
      age = student.pop('возраст')
      # Теперь словарь выглядит так: {'имя': 'Иван'}
      # Вывод: 21
      

Задания на тренировку операций со словарями

Задание 6. Простая манипуляция со значениями. Создайте словарь с информацией о книге (название, автор, год издания). Измените год издания, увеличив его на 5 лет.

Задание 7. Удаление элемента с проверкой. У вас есть словарь с результатами экзаменов студентов. Удалите оценку одного из предметов, но сначала проверьте, существует ли такой предмет.

Задание 8. Создание словаря из двух списков. У вас есть два списка: один с названиями товаров, другой с их ценами. Создайте словарь, используя товары в качестве ключей и цены в качестве значений.

Задание 9. Сортировка словаря. Создайте словарь с несколькими парами «ключ-значение». Отсортируйте словарь по ключам в алфавитном порядке и выведите отсортированные пары.

Задание 10. Анализ текста с использованием словаря. У вас есть текст. Создайте словарь, где ключи — слова, а значения — количество раз, которое каждое слово встречается в тексте.

Решения
# Задание 6
book_info = {'название': 'Война и мир', 'автор': 'Л. Толстой', 'год_издания': 1869}
book_info['год_издания'] += 5
# Вывод: {'название': 'Война и мир', 'автор': 'Л. Толстой', 'год_издания': 1874}

# Задание 7
exam_results = {'математика': 90, 'физика': 85, 'химия': 78}
subject_to_remove = 'физика'
if subject_to_remove in exam_results:
    del exam_results[subject_to_remove]
# Вывод: {'математика': 90, 'химия': 78}

# Задание 8
products = ['яблоко', 'банан', 'апельсин']
prices = [2, 1, 3]
price_dict = dict(zip(products, prices))
# Вывод: {'яблоко': 2, 'банан': 1, 'апельсин': 3}

# Задание 9
unsorted_dict = {'b': 3, 'a': 1, 'c': 2}
sorted_dict = dict(sorted(unsorted_dict.items()))
# Вывод: {'a': 1, 'b': 3, 'c': 2}

# Задание 10
text = "Python - это язык программирования. Python очень популярен."
word_count = {}
for word in text.split():
    word_count[word] = word_count.get(word, 0) + 1
# Вывод: {'Python': 2, '-': 1, 'это': 1, 'язык': 1, 'программирования.': 1, 'очень': 1, 'популярен.': 1}

Перебор элементов словаря

В Python для перебора элементов словаря в цикле часто используется цикл for. Есть несколько способов обхода словаря:

  1. Перебор ключей:
    • При переборе ключей можно использовать метод keys().
      student = {'имя': 'Иван', 'возраст': 20, 'курс': 2}
      
      for key in student.keys():
          print(key)
      
  2. Перебор значений:
    • Используйте метод values() для перебора значений.
      for value in student.values():
          print(value)
      
  3. Перебор пар «ключ-значение»:
    • Метод items() возвращает кортежи, содержащие пары «ключ-значение».
      for key, value in student.items():
          print(f'{key}: {value}')
      
  4. Перебор по ключам с использованием цикла for key in dict:
    • Можно перебирать словарь напрямую по его ключам, так как цикл for по умолчанию перебирает ключи.
      for key in student:
          print(key)
      

Задания на перебор словаря

Задание 11. Простой перебор значений. Создайте словарь с оценками студента по разным предметам. Выведите все оценки студента.

Задание 12. Перебор пар «ключ-значение» с условием. У вас есть словарь с возрастом людей. Выведите только тех, кто старше 25 лет.

Задание 13. Сложный перебор. Создайте словарь, представляющий результаты спортивных команд в нескольких матчах. Выведите среднее количество забитых голов для каждой команды.

Задание 14. Перебор сложных структур. Создайте словарь с информацией о студентах, включая списки предметов, которые они изучают. Выведите все предметы, которые изучают все студенты.

Задание 15. Перебор с использованием функции. Создайте словарь с товарами и их ценами. Напишите функцию, которая увеличит цены на все товары на 10%, а затем выведите обновленные цены.

Решение
# Задание 11
grades = {'математика': 90, 'физика': 85, 'химия': 78}
for grade in grades.values():
    print(grade)
# Вывод: 90, 85, 78

# Задание 12
ages = {'Анна': 30, 'Иван': 25, 'Мария': 28}
for name, age in ages.items():
    if age > 25:
        print(f'{name} - {age} лет')
# Вывод: Анна - 30 лет, Мария - 28 лет

# Задание 13
sports_results = {'Команда1': [2, 3, 1], 'Команда2': [4, 2, 0]}
for team, goals in sports_results.items():
    average_goals = sum(goals) / len(goals)
    print(f'{team}: Среднее количество забитых голов - {average_goals}')
# Вывод: Команда1: Среднее количество забитых голов - 2.0
#        Команда2: Среднее количество забитых голов - 2.0

# Задание 14
students_info = {
    'Студент1': {'предметы': ['математика', 'физика'], 'возраст': 20},
    'Студент2': {'предметы': ['физика', 'химия'], 'возраст': 22}
}

all_subjects = set()
for student_data in students_info.values():
    all_subjects.update(student_data['предметы'])

print('Предметы, которые изучают все студенты:', all_subjects)
# Вывод: Предметы, которые изучают все студенты: {'математика', 'физика', 'химия'}

# Задание 15
prices = {'яблоко': 2, 'банан': 1, 'апельсин': 3}

def increase_prices(dictionary, percentage):
    for key in dictionary:
        dictionary[key] *= (1 + percentage / 100)

increase_prices(prices, 10)
print('Обновленные цены:', prices)
# Вывод: Обновленные цены: {'яблоко': 2.2, 'банан': 1.1, 'апельсин': 3.3}

Отличия словарей от других структур данных

Словари в Python отличаются от других структур данных, таких как списки, кортежи и множества, в нескольких ключевых аспектах:

  1. Неупорядоченность:
    • Словари являются неупорядоченными коллекциями данных, что означает, что порядок элементов в словаре не гарантирован. В списке порядок элементов важен, а в словаре доступ к значениям осуществляется по ключам.
  2. Использование ключей:
    • В отличие от списков, которые индексируются целыми числами, словари используют ключи для доступа к своим значениям. Это позволяет эффективно организовывать и поисково обрабатывать данные.
  3. Изменяемость:
    • Словари являются изменяемыми структурами данных, что означает, что их содержимое можно изменять после создания. Например, вы можете добавлять, изменять и удалять элементы в словаре.
  4. Уникальность ключей:
    • Ключи в словаре должны быть уникальными. Это означает, что в одном словаре не может быть двух одинаковых ключей. Если вы добавляете значение с уже существующим ключом, оно просто перезаписывает предыдущее значение.
  5. Использование различных типов ключей:
    • В словарях в качестве ключей могут использоваться различные типы данных, такие как строки, числа, кортежи, но неизменяемые. В списках, например, ключами могут быть только целые числа.
  6. Поддержка различных типов значений:
    • Значения в словаре могут быть любого типа данных, включая числа, строки, списки, кортежи, другие словари и т.д.

Пример использования словаря:

student = {'имя': 'Иван', 'возраст': 20, 'оценки': [90, 85, 78]}

В данном примере 'имя', 'возраст' и 'оценки' — это ключи, а 'Иван', 20 и [90, 85, 78] — соответствующие значения. Это позволяет легко организовывать и манипулировать данными в программе.

Методы словарей

  1. clear() — очистка словаря:
    • Метод clear() удаляет все элементы из словаря.
      my_dict = {'a': 1, 'b': 2, 'c': 3}
      my_dict.clear()
      # Теперь my_dict равен {}
      
  2. copy() — копирование словаря:
    • Метод copy() создает поверхностную копию словаря.
      original_dict = {'a': 1, 'b': 2, 'c': 3}
      copied_dict = original_dict.copy()
      
  3. get(key, default=None) — получение значения по ключу:
    • Метод get() возвращает значение для указанного ключа, если ключ существует, иначе возвращает значение по умолчанию (по умолчанию None).
      value = my_dict.get('a', 'Ключ не существует')
      # Вывод: 1
      
  4. items() — получение пар «ключ-значение»:
    • Метод items() возвращает представление всех пар «ключ-значение» в словаре.
      key_value_pairs = my_dict.items()
      # Вывод: dict_items([('a', 1), ('b', 2), ('c', 3)])
      
  5. keys() — получение ключей:
    • Метод keys() возвращает представление всех ключей в словаре.
      keys = my_dict.keys()
      # Вывод: dict_keys(['a', 'b', 'c'])
      
  6. values() — получение значений:
    • Метод values() возвращает представление всех значений в словаре.
      values = my_dict.values()
      # Вывод: dict_values([1, 2, 3])
      
  7. pop(key, default=None) — удаление элемента по ключу и возврат значения:
    • Метод pop() удаляет элемент по ключу и возвращает его значение. Если ключ не существует, возвращает значение по умолчанию (по умолчанию None).
      removed_value = my_dict.pop('a', 'Ключ не существует')
      # Вывод: 1
      
  8. popitem() — удаление и возврат последней пары «ключ-значение»:
    • Метод popitem() удаляет и возвращает последнюю добавленную пару «ключ-значение».
      last_pair = my_dict.popitem()
      # Вывод: ('c', 3)
      
  9. setdefault(key, default=None) — получение значения по ключу или добавление нового:
    • Метод setdefault() возвращает значение по ключу, если ключ существует, иначе добавляет новый ключ со значением по умолчанию.
      value = my_dict.setdefault('d', 4)
      # Вывод: 4
      
  10. update(iterable) — обновление словаря:
    • Метод update() обновляет словарь, добавляя элементы из другого словаря или итерабельного объекта.
      new_data = {'e': 5, 'f': 6}
      my_dict.update(new_data)
      # Теперь my_dict содержит {'a': 1, 'b': 2, 'c': 3, 'e': 5, 'f': 6}
      
  11. fromkeys(keys, value=None) — создание словаря из ключей и значения:
    • Метод fromkeys() создает новый словарь с указанными ключами и значениями.
      keys = ['a', 'b', 'c']
      new_dict = dict.fromkeys(keys, 0)
      # Вывод: {'a': 0, 'b': 0, 'c': 0}
      
  12. popitem() — удаление и возврат последней пары «ключ-значение»:
    • Метод popitem() удаляет и возвращает последнюю добавленную пару «ключ-значение».
      last_pair = my_dict.popitem()
      # Вывод: ('c', 3)
      

Задания на использование методов словарей.

Задание 16. Простое обновление и вывод. Создайте словарь с данными о количестве книг разных жанров. Добавьте новые данные о количестве книг другого жанра и выведите обновленный словарь.

Задание 17. Удаление элемента с проверкой. Создайте словарь с данными о количестве яблок и груш. Удалите информацию о грушах, предварительно проверив ее наличие.

Задание 18. Создание копии и изменение оригинала. Создайте словарь с информацией о продуктах и их ценах. Сделайте копию словаря, затем изменив цены в копии, выведите оба словаря.

Задание 19. Использование setdefault() .Создайте словарь с данными о студентах и их оценках. Используйте setdefault() для добавления нового студента с оценкой по умолчанию.

Задание 20. Объединение словарей с помощью update(). Создайте два словаря с данными о товарах. Объедините их, используя метод update(), и выведите результат.

# Задание 16
book_genres = {'фантастика': 20, 'детектив': 15, 'роман': 25}
book_genres['поэзия'] = 10
# Вывод: {'фантастика': 20, 'детектив': 15, 'роман': 25, 'поэзия': 10}

# Задание 17
fruits = {'яблоки': 30, 'груши': 15}
if 'груши' in fruits:
    del fruits['груши']
# Вывод: {'яблоки': 30}

# Задание 18
original_prices = {'яблоко': 2, 'банан': 1, 'апельсин': 3}
copied_prices = original_prices.copy()
copied_prices['банан'] = 2.5
# Вывод:
# original_prices: {'яблоко': 2, 'банан': 1, 'апельсин': 3}
# copied_prices: {'яблоко': 2, 'банан': 2.5, 'апельсин': 3}

# Задание 19
students_grades = {'Иван': 90, 'Мария': 85, 'Алексей': 78}
new_student = 'Екатерина'
students_grades.setdefault(new_student, 0)
# Вывод: {'Иван': 90, 'Мария': 85, 'Алексей': 78, 'Екатерина': 0}

# Задание 20
products1 = {'яблоко': 2, 'банан': 1}
products2 = {'апельсин': 3, 'груша': 2}
products1.update(products2)
# Вывод: {'яблоко': 2, 'банан': 1, 'апельсин': 3, 'груша': 2}

Агрегатные функции и сортировка в словарях.

Применение агрегатных функций к словарям:

Агрегатные функции могут быть использованы для обработки значений в словаре, позволяя выполнять различные вычисления на основе этих данных. Рассмотрим несколько примеров:

  1. Вычисление суммы значений:
    • Используя метод sum(), можно вычислить сумму всех значений в словаре.
      prices = {'яблоко': 2, 'банан': 1, 'апельсин': 3}
      total_price = sum(prices.values())
      # Вывод: 6
      
  2. Нахождение среднего значения:
    • Среднее значение можно вычислить, разделив сумму значений на их количество.
      average_price = total_price / len(prices)
      # Вывод: 2.0
      
  3. Нахождение минимального и максимального значений:
    • Методы min() и max() позволяют найти минимальное и максимальное значение в словаре.
      min_price = min(prices.values())
      max_price = max(prices.values())
      # Вывод: min_price = 1, max_price = 3
      
  4. Подсчет количества элементов:
    • Функция len() может быть использована для подсчета количества элементов в словаре (количество ключей).
      num_items = len(prices)
      # Вывод: 3
      
  5. Сортировка словаря по ключам и значениям:
    • По ключам:
      • Для сортировки словаря по ключам можно использовать функцию sorted().
        sorted_prices = dict(sorted(prices.items()))
        # Вывод: {'апельсин': 3, 'банан': 1, 'яблоко': 2}
        
    • По значениям:
      • Для сортировки словаря по значениям, передайте параметр key в sorted().
        sorted_prices_by_value = dict(sorted(prices.items(), key=lambda item: item[1]))
        # Вывод: {'банан': 1, 'яблоко': 2, 'апельсин': 3}
        
    • Важно отметить, что словари в Python не поддерживают сортировку в том смысле, что они не сохраняют порядок элементов. Сортировка возвращает новый словарь или список кортежей.

Задания для тренировки

Задание 21. Вычисление среднего значения. Создайте словарь с оценками студентов по математике. Вычислите и выведите средний балл.

Задание 22. Нахождение минимального значения. Создайте словарь с высотой различных объектов. Найдите и выведите минимальную высоту.

Задание 23. Сортировка по значениям в порядке убывания. Создайте словарь с продажами разных товаров. Отсортируйте его по убыванию и выведите результат.

Задание 24. Средняя длина слов в тексте. Создайте словарь, где ключи — это слова, а значения — их длина. Вычислите и выведите среднюю длину слова.

Задание 25. Сортировка по ключам в алфавитном порядке. Создайте словарь с информацией о разных странах. Отсортируйте его по ключам в алфавитном порядке и выведите результат.

Решения
# Задание 21
math_grades = {'Иван': 90, 'Мария': 85, 'Алексей': 78}
average_grade = sum(math_grades.values()) / len(math_grades)
# Вывод: Средний балл: 84.33333333333333

# Задание 22
heights = {'стул': 0.5, 'стол': 0.8, 'шкаф': 2.0}
min_height = min(heights.values())
# Вывод: Минимальная высота: 0.5

# Задание 23
sales = {'яблоко': 100, 'банан': 150, 'апельсин': 120}
sorted_sales = dict(sorted(sales.items(), key=lambda item: item[1], reverse=True))
# Вывод: {'банан': 150, 'апельсин': 120, 'яблоко': 100}

# Задание 24
text = "Python - это мощный язык программирования."
word_lengths = {word: len(word) for word in text.split()}
average_length = sum(word_lengths.values()) / len(word_lengths)
# Вывод: Средняя длина слова: 6.428571428571429

# Задание 25
countries_info = {'Россия': 'Москва', 'США': 'Вашингтон', 'Китай': 'Пекин'}
sorted_countries = dict(sorted(countries_info.items()))
# Вывод: {'Китай': 'Пекин', 'Россия': 'Москва', 'США': 'Вашингтон'}

Практические примеры использования словарей

  1. Словарь для хранения информации о студентах:
    • Вы можете использовать словарь для хранения информации о студентах, включая их имена, оценки по различным предметам и другие данные.
      students_data = {
          'Иванов': {'математика': 90, 'физика': 85, 'химия': 78},
          'Петров': {'математика': 92, 'физика': 88, 'химия': 76},
          'Сидоров': {'математика': 85, 'физика': 80, 'химия': 92}
      }
      
  2. Словарь для отображения рейтинга фильмов:
    • Вы можете использовать словарь для создания рейтинга фильмов, где ключи — это названия фильмов, а значения — рейтинги.
      movie_ratings = {
          'Звездные войны': 9.0,
          'Властелин колец': 8.5,
          'Гарри Поттер': 8.2
      }
      
  3. Словарь для хранения настроек приложения:
    • Используйте словарь для хранения настроек приложения, например, цветовую схему, размер шрифта и другие параметры.
      app_settings = {
          'цвет_фона': 'синий',
          'размер_шрифта': 12,
          'тема': 'темная'
      }
      
  4. Словарь для учета товаров на складе:
    • Ведите учет товаров на складе, используя словарь, где ключи — это названия товаров, а значения — количество товаров на складе.
      inventory = {
          'ноутбуки': 50,
          'принтеры': 20,
          'мониторы': 30
      }
      
  5. Словарь для отображения перевода слов:
    • Используйте словарь для создания простого словаря, где ключи — это слова на одном языке, а значения — их перевод на другой язык.
      translation_dict = {
          'hello': 'привет',
          'world': 'мир',
          'python': 'питон'
      }
      

Распаковка словарей в Python

Распаковка словарей (dictionary unpacking) в Python — это механизм, который позволяет извлекать элементы из словаря. Делается это с помощью оператора **

Распакованные пары  использовать их для инициализации другого словаря или передачи аргументов функции. Этот процесс делает код более компактным и улучшает читаемость.

Основные способы использования распаковки словарей:

  1. Инициализация нового словаря:
    dict1 = {'a': 1, 'b': 2}
    dict2 = {'c': 3, 'd': 4}
    combined_dict = {**dict1, **dict2}
    

    В результате combined_dict будет содержать все элементы из dict1 и dict2. Если ключи повторяются, значения из второго словаря перезапишут значения из первого.

  2. Передача аргументов функции:
    def example_function(**kwargs):
        for key, value in kwargs.items():
            print(f"{key}: {value}")
    
    args = {'a': 1, 'b': 2, 'c': 3}
    example_function(**args)
    

    В данном случае, распаковка словаря args передается в функцию example_function в качестве именованных аргументов.

Оператор объединения словарей

Оператор «|» в Python, применительно к словарям, используется для объединения двух словарей в один. Это можно сделать с помощью следующего синтаксиса:

result = dict1 | dict2

В этом примере, «result» будет новым словарем, который содержит все ключи и значения из «dict1» и «dict2». Если ключ присутствует в обоих словарях, то в «result» будет сохранено значение из «dict2». Если ключ присутствует только в одном из словарей, то его значение будет сохранено в «result».

Однако, стоит отметить, что оператор «|» не является стандартным оператором для объединения словарей в Python. Он доступен только в Python 3.9 и более поздних версиях, и он является частью новой функции «dict()», которая была добавлена в Python 3.9.

Если вы используете более раннюю версию Python, вы можете использовать следующий код для объединения двух словарей:

result = {**dict1, **dict2}

Вопросы

1. Чем отличаются изменяемые и неизменяемые типы данных.
2. Какие из приведенных ниже переменных изменяемого типа, а какие нет:

i = 5
s = 'Hello'
z = [1,2,3,4,5]
f = {1,2,3,4,5}
t = True
tp = (1,2,3,4,5)
tp2 = (1,1,2,[3,3,3])

3. Как создать словари. Приведи примеры создания тремя разными способами.
4. Что такое ключ словаря?
5. Что может быть ключами словарей? Что не может?
6. Перечисли методы словарей, которые ты знаешь?
7. Как перебрать ключи словаря?
8. Как перебрать значения словаря?
9. Как перебрать и ключи и значения одновременно?
10. Что такое лямбда функции. Приведи пример использования такой функции для сортировки.
11. Как отсортировать словарь по ключам? Приведи пример.
12. Как отсортировать словарь по значениям? Пример.
13. Может ли словарь быть ключом словаря? Значением словаря?

Практические задания на словари

Задание 26. Подсчет частоты слов в тексте. Напишите программу для подсчета частоты каждого слова в тексте.

Задание 27. Создание меню ресторана. Создайте словарь, представляющий меню ресторана с названиями блюд и их ценами.

Задание 28. Учет расходов. Ведите учет своих расходов за месяц, используя словарь, где ключи — категории расходов, а значения — суммы.

Задание 29. Генератор случайных паролей. Напишите программу, создающую словарь, где ключи — это имена пользователей, а значения — случайно сгенерированные пароли.

Задание 30. Сортировка учеников по средней оценке. Создайте словарь с данными о средних оценках учеников и отсортируйте его по убыванию средних оценок.

Задание 31. Словарь для перевода чисел в текст. Напишите программу, использующую словарь для перевода чисел от 1 до 10 в текст (например, 1 — ‘один’, 2 — ‘два’ и т.д.).

Задание 32. Подсчет символов в тексте. Создайте словарь, где ключи — это символы, а значения — их количество в заданном тексте.

Задание 33. Игра «Крестики-нолики». Реализуйте игру «Крестики-нолики» с использованием словаря для представления игрового поля.

Задание 34. Хранение информации о книгах в библиотеке. Создайте словарь, представляющий библиотеку, где ключи — это названия книг, а значения — информация о каждой книге.

Задание 35. Поиск наиболее часто встречающегося элемента в списке. Напишите функцию, использующую словарь для подсчета частоты встречаемости каждого элемента в списке, и верните наиболее часто встречающийся элемент.

Задание 36. Шифрование текста с использованием замены символов. Напишите программу для шифрования текста с использованием словаря для замены символов.

Задание 37. Симуляция банковского счета. Создайте программу, использующую словарь для представления банковского счета с методами для внесения и снятия средств.

Задание 38. Учет рабочего времени сотрудников. Ведите учет отработанного времени сотрудников, используя словарь с ключами — именами сотрудников и значениями — количеством часов.

Задание 39. Поиск общих элементов в списках. Напишите функцию, использующую словарь для нахождения общих элементов в двух списках.

Задание 40. Анализ результатов опроса. Создайте программу для анализа результатов опроса, используя словарь для подсчета частоты каждого ответа.

Решения
# Задание 26
text = "Это пример текста для подсчета частоты слов в тексте. Пример."
word_frequency = {}
for word in text.split():
    word_frequency[word] = word_frequency.get(word, 0) + 1
# Вывод: {'Это': 1, 'пример': 2, 'текста': 1, 'для': 1, 'подсчета': 1, 'частоты': 1, 'слов': 1, 'в': 1, 'тексте.': 1, 'Пример.': 1}

# Задание 27
restaurant_menu = {'пицца': 10, 'паста': 8, 'салат': 5}
# (Пример использования меню в коде)

# Задание 28
expenses = {'продукты': 200, 'транспорт': 100, 'развлечения': 150}
# (Пример использования словаря с расходами в коде)

# Задание 29
import random
user_passwords = {user: ''.join(random.choices('abcdef1234567890', k=8)) for user in ['user1', 'user2', 'user3']}
# Вывод: {'user1': 'a3c78bdf', 'user2': '1e4f6a7c', 'user3': 'bd2f8e5a'}

# Задание 30
students_grades = {'Иван': 90, 'Мария': 85, 'Алексей': 78}
sorted_grades = dict(sorted(students_grades.items(), key=lambda item: item[1], reverse=True))
# Вывод: {'Иван': 90, 'Мария': 85, 'Алексей': 78}

# Задание 31
numbers_to_text = {1: 'один', 2: 'два', 3: 'три', 4: 'четыре', 5: 'пять', 6: 'шесть', 7: 'семь', 8: 'восемь', 9: 'девять', 10: 'десять'}
# (Пример использования словаря в коде)

# Задание 32
text = "Пример текста для подсчета символов."
character_counts = {char: text.count(char) for char in set(text)}
# Вывод: {'П': 1, 'о': 2, 'д': 2, 'е': 3, 'л': 1, 'с': 4, 'а': 2, 'м': 1, 'т': 4, 'я': 1, 'б': 1, 'щ': 1, 'и': 2, 'р': 2, 'в': 1, 'пробел': 5, '.': 1}

# Задание 33
# (Пример использования словаря для реализации игры "Крестики-нолики")

# Задание 34
library_books = {'Красная книга': {'автор': 'А. Иванов', 'год': 2005}, 'Зеленая книга': {'автор': 'В. Петров', 'год': 2010}}
# (Пример использования словаря для представления библиотеки в коде)

# Задание 35
def most_common_element(input_list):
    element_counts = {element: input_list.count(element) for element in set(input_list)}
    return max(element_counts, key=element_counts.get)
# (Пример использования функции для поиска наиболее часто встречающегося элемента в списке)

# Задание 36
def encrypt_text(text):
    substitution_dict = {'а': '1', 'б': '2', 'в': '3', 'г': '4', 'д': '5', 'е': '6'}
    encrypted_text = ''.join(substitution_dict.get(char, char) for char in text)
    return encrypted_text
# (Пример использования функции для шифрования текста)

# Задание 37
class BankAccount:
    def __init__(self, initial_balance):
        self.balance = initial_balance

    def deposit(self, amount):
        self.balance += amount

    def withdraw(self, amount):
        if amount <= self.balance:
            self.balance -= amount
            return amount
        else:
            return "Недостаточно средств"

# (Пример использования класса для представления банковского счета в коде)

# Задание 38
work_hours = {'Иван': 40, 'Мария': 35, 'Алексей': 42}
# (Пример использования словаря с часами работы в коде)

# Задание 39
list1 = [1, 2, 3, 4, 5]
list2 = [3, 4, 5, 6, 7]
common_elements = {element for element in list1 if element in list2}
# Вывод: {3, 4, 5}

# Задание 40
survey_results = {'вопрос1': {'да': 15, 'нет': 5}, 'вопрос2': {'да': 10, 'нет': 10}}
# (Пример использования словаря для анализа результатов опроса)

Задания повышенной сложности

Задание 1: Анализ текста с использованием словарей

Вам дан текст большой статьи. Ваша задача — написать программу на Python, которая анализирует этот текст и выводит следующую информацию:

  • Количество уникальных слов в тексте.
  • Топ 5 самых часто встречающихся слов и их частота.
  • Количество уникальных символов в тексте.

Задание 2: Реализация словаря с поддержкой истории операций

Создайте класс HistoryDict, который реализует словарь с историей операций. Класс должен иметь следующие методы:

  • __init__: конструктор класса.
  • add(key, value): добавление элемента в словарь и запись операции в историю.
  • remove(key): удаление элемента из словаря и запись операции в историю.
  • get_history(): получение истории операций в виде списка кортежей (операция, ключ, значение).

Пример использования:

history_dict = HistoryDict()
history_dict.add('a', 1)
history_dict.add('b', 2)
history_dict.remove('a')
print(history_dict.get_history())
# Вывод: [('add', 'a', 1), ('add', 'b', 2), ('remove', 'a', None)]

Индивидуальное и групповое обучение «Python Junior»
Если вы хотите научиться программировать на Python, могу помочь. Запишитесь на мой курс «Python Junior» и начните свой путь в мир ИТ уже сегодня!

Контакты
Для получения дополнительной информации и записи на курсы свяжитесь со мной:

Телеграм: https://t.me/Vvkomlev
Email: victor.komlev@mail.ru

Объясняю сложное простыми словами. Даже если вы никогда не работали с ИТ и далеки от программирования, теперь у вас точно все получится! Проверено десятками примеров моих учеников.

Гибкий график обучения. Я предлагаю занятия в мини-группах и индивидуально, что позволяет каждому заниматься в удобном темпе. Вы можете совмещать обучение с работой или учебой.

Практическая направленность. 80%: практики, 20% теории. У меня множество авторских заданий, которые фокусируются на практике. Вы не просто изучаете теорию, а сразу применяете знания в реальных проектах и задачах.

Разнообразие учебных материалов: Теория представлена в виде текстовых уроков с примерами и видео, что делает обучение максимально эффективным и удобным.

Понимаю, что обучение информационным технологиям может быть сложным, особенно для новичков. Моя цель – сделать этот процесс максимально простым и увлекательным. У меня персонализированный подход к каждому ученику. Максимальный фокус внимания на ваши потребности и уровень подготовки.

Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева
Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.