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

словари в 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}

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

Задание 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)]

 

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

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