Словарь в 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 предоставляют множество возможностей для эффективного решения различных задач.
- Сопоставление данных:
- Пример: Хранение информации о студентах с использованием их имен в качестве ключей и данных (например, возраст, оценки) в качестве значений.
- Индексация и быстрый доступ:
- Пример: Использование словаря для индексации данных по уникальному идентификатору, что позволяет быстро получать доступ к нужным значениям.
- Группировка данных:
- Пример: Сохранение данных в словаре в виде групп, где каждая группа представлена ключом, а связанные с ней данные — значениями.
- Счетчики и подсчет элементов:
- Пример: Подсчет частоты встречаемости элементов в последовательности, где ключи — элементы, а значения — количество их появлений.
- Кеширование результатов:
- Пример: Сохранение результатов выполнения дорогостоящих операций в словаре для избежания повторных вычислений при одинаковых входных данных.
- Создание конфигураций и параметров:
- Пример: Хранение настроек программы в словаре для удобного доступа и изменения параметров.
- Сопоставление справочной информации:
- Пример: Создание справочника, где ключи — термины, а значения — их определения или связанные данные.
- Фильтрация и поиск данных:
- Пример: Использование словарей для фильтрации данных по определенному критерию, что может быть полезно при анализе данных.
Способы создания словарей
- Вручную:
- Простейший способ создания словаря — вручную указать ключи и соответствующие значения в фигурных скобках.
student = {'имя': 'Иван', 'возраст': 20, 'курс': 2}
- Простейший способ создания словаря — вручную указать ключи и соответствующие значения в фигурных скобках.
- Через функцию
dict()
:- Можно создавать словари, используя встроенную функцию
dict()
. Это особенно удобно, когда у вас есть последовательности ключей и значений.student = dict(имя='Иван', возраст=20, курс=2)
- Можно создавать словари, используя встроенную функцию
- С использованием генератора:
- Генераторы словарей предоставляют компактный способ создания словарей с использованием выражения в фигурных скобках.
squares = {x: x**2 for x in range(1, 6)} # Вывод: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
- Генераторы словарей предоставляют компактный способ создания словарей с использованием выражения в фигурных скобках.
- С использованием функции
zip()
:- Функция
zip()
позволяет объединять две последовательности в кортежи, которые затем можно использовать для создания словаря.keys = ['a', 'b', 'c'] values = [1, 2, 3] my_dict = dict(zip(keys, values)) # Вывод: {'a': 1, 'b': 2, 'c': 3}
- Функция
- С помощью метода
fromkeys()
:- Метод
fromkeys()
создает новый словарь с заданными ключами и начальным значением (по умолчаниюNone
).keys = ['a', 'b', 'c'] my_dict = dict.fromkeys(keys, 0) # Вывод: {'a': 0, 'b': 0, 'c': 0}
- Метод
- С использованием конструктора
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). Это свойство определяет, может ли объект изменять свое состояние после создания.
Неизменяемые типы данных:
- int (целые числа):
- Пример:
x = 5
- Пример:
- float (вещественные числа):
- Пример:
y = 3.14
- Пример:
- str (строки):
- Пример:
text = "Hello"
- Пример:
- tuple (кортежи):
- Пример:
coordinates = (1, 2)
- Пример:
- frozenset (неизменяемое множество):
- Пример:
frozen_set = frozenset([1, 2, 3])
- Пример:
- bool (логический тип данных):
- Пример:
flag = True
- Пример:
Неизменяемые объекты не могут быть изменены после создания. Если, например, вы присваиваете новое значение переменной типа int, создается новый объект.
Изменяемые типы данных:
- list (списки):
- Пример:
my_list = [1, 2, 3]
- Пример:
- dict (словари):
- Пример:
my_dict = {'a': 1, 'b': 2}
- Пример:
- set (множества):
- Пример:
my_set = {1, 2, 3}
- Пример:
- bytearray (изменяемый массив байтов):
- Пример:
byte_array = bytearray([65, 66, 67])
- Пример:
- byte (байтовая строка):
- Пример:
byte_string = b"hello"
- Пример:
- array (массивы):
- Пример:
from array import array; my_array = array('i', [1, 2, 3])
- Пример:
- custom objects с возможностью изменения:
- Пример:
class MyClass: pass; obj = MyClass()
- Пример:
Изменяемые объекты могут изменять свое состояние после создания. Например, при изменении значения в списке, объект списка остается тем же, и изменения видны повсюду, где используется этот список.
Хэширование в Python
Хеширование в Python связано с использованием хэш-функций для преобразования объектов в числовые значения, называемые хеш-кодами. Хеш-коды используются, например, для быстрого поиска в словарях или множествах. Однако не все объекты могут быть хэшированы в Python. Рассмотрим, какие объекты можно и нельзя хэшировать:
Объекты, которые МОЖНО хэшировать:
- Неизменяемые (immutable) типы данных:
- int:
hash(42)
- float:
hash(3.14)
- str:
hash("hello")
- tuple:
hash((1, 2, 3))
- frozenset:
hash(frozenset([1, 2, 3]))
- int:
- Объекты с пользовательским методом
__hash__
:- Если пользователь явно определил метод
__hash__
в своем объекте, то этот объект может быть хэширован.
- Если пользователь явно определил метод
Объекты, которые НЕЛЬЗЯ хэшировать:
- Изменяемые (mutable) типы данных:
- list:
hash([1, 2, 3])
- set:
hash({1, 2, 3})
- dict:
hash({'a': 1, 'b': 2})
- list:
- Объекты без определенного метода
__hash__
и__eq__
:- Если объект не имеет явно определенных методов
__hash__
и__eq__
, то он не может быть хэширован. Например, пользовательский класс без определения этих методов.
- Если объект не имеет явно определенных методов
- Объекты с изменяемыми состояниями после создания:
- Если объект изменяется после создания (например, имеет изменяемое состояние), то он не может быть хэширован. Это касается, например, списков, множеств и словарей.
- Объекты с методом
__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) остается неизменным, что важно для корректной работы словарей.
Вот некоторые типы данных, которые могут быть использованы в качестве ключей в словарях:
- int (целые числа)
- float (вещественные числа)
- str (строки)
- tuple (кортежи) с элементами, которые сами по себе неизменяемы
- frozenset (неизменяемые множества)
- bool (логический тип данных)
- bytes (байтовые строки)
- None (пустой объект)
- 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:
- Доступ к значениям по ключу:
- Используйте ключ для получения значения из словаря. Если ключ не существует, возникает ошибка.
student = {'имя': 'Иван', 'возраст': 20, 'курс': 2} name = student['имя'] # Вывод: 'Иван'
- Используйте ключ для получения значения из словаря. Если ключ не существует, возникает ошибка.
- Изменение значений по ключу:
- Просто присвойте новое значение существующему ключу.
student['возраст'] = 21 # Теперь словарь выглядит так: {'имя': 'Иван', 'возраст': 21, 'курс': 2}
- Просто присвойте новое значение существующему ключу.
- Удаление элементов:
- Используйте ключ для удаления элемента из словаря с помощью оператора
del
.del student['курс'] # Теперь словарь выглядит так: {'имя': 'Иван', 'возраст': 21}
- Используйте ключ для удаления элемента из словаря с помощью оператора
- Проверка наличия ключа в словаре:
- Используйте оператор
in
для проверки наличия ключа в словаре.has_age = 'возраст' in student # Вывод: True
- Используйте оператор
- Безопасное получение значения по ключу с методом
get()
:- Метод
get()
позволяет получить значение по ключу, и если ключ отсутствует, возвращает значение по умолчанию (илиNone
, если не указано).age = student.get('возраст', 'Неизвестно') # Вывод: 21
- Метод
- Методы
keys()
,values()
,items()
:keys()
: Возвращает список всех ключей в словаре.values()
: Возвращает список всех значений в словаре.items()
: Возвращает список кортежей (ключ, значение) в словаре.keys_list = student.keys() values_list = student.values() items_list = student.items()
- Метод
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
. Есть несколько способов обхода словаря:
- Перебор ключей:
- При переборе ключей можно использовать метод
keys()
.student = {'имя': 'Иван', 'возраст': 20, 'курс': 2} for key in student.keys(): print(key)
- При переборе ключей можно использовать метод
- Перебор значений:
- Используйте метод
values()
для перебора значений.for value in student.values(): print(value)
- Используйте метод
- Перебор пар «ключ-значение»:
- Метод
items()
возвращает кортежи, содержащие пары «ключ-значение».for key, value in student.items(): print(f'{key}: {value}')
- Метод
- Перебор по ключам с использованием цикла
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 отличаются от других структур данных, таких как списки, кортежи и множества, в нескольких ключевых аспектах:
- Неупорядоченность:
- Словари являются неупорядоченными коллекциями данных, что означает, что порядок элементов в словаре не гарантирован. В списке порядок элементов важен, а в словаре доступ к значениям осуществляется по ключам.
- Использование ключей:
- В отличие от списков, которые индексируются целыми числами, словари используют ключи для доступа к своим значениям. Это позволяет эффективно организовывать и поисково обрабатывать данные.
- Изменяемость:
- Словари являются изменяемыми структурами данных, что означает, что их содержимое можно изменять после создания. Например, вы можете добавлять, изменять и удалять элементы в словаре.
- Уникальность ключей:
- Ключи в словаре должны быть уникальными. Это означает, что в одном словаре не может быть двух одинаковых ключей. Если вы добавляете значение с уже существующим ключом, оно просто перезаписывает предыдущее значение.
- Использование различных типов ключей:
- В словарях в качестве ключей могут использоваться различные типы данных, такие как строки, числа, кортежи, но неизменяемые. В списках, например, ключами могут быть только целые числа.
- Поддержка различных типов значений:
- Значения в словаре могут быть любого типа данных, включая числа, строки, списки, кортежи, другие словари и т.д.
Пример использования словаря:
student = {'имя': 'Иван', 'возраст': 20, 'оценки': [90, 85, 78]}
В данном примере 'имя'
, 'возраст'
и 'оценки'
— это ключи, а 'Иван'
, 20
и [90, 85, 78]
— соответствующие значения. Это позволяет легко организовывать и манипулировать данными в программе.
Методы словарей
clear()
— очистка словаря:- Метод
clear()
удаляет все элементы из словаря.my_dict = {'a': 1, 'b': 2, 'c': 3} my_dict.clear() # Теперь my_dict равен {}
- Метод
copy()
— копирование словаря:- Метод
copy()
создает поверхностную копию словаря.original_dict = {'a': 1, 'b': 2, 'c': 3} copied_dict = original_dict.copy()
- Метод
get(key, default=None)
— получение значения по ключу:- Метод
get()
возвращает значение для указанного ключа, если ключ существует, иначе возвращает значение по умолчанию (по умолчаниюNone
).value = my_dict.get('a', 'Ключ не существует') # Вывод: 1
- Метод
items()
— получение пар «ключ-значение»:- Метод
items()
возвращает представление всех пар «ключ-значение» в словаре.key_value_pairs = my_dict.items() # Вывод: dict_items([('a', 1), ('b', 2), ('c', 3)])
- Метод
keys()
— получение ключей:- Метод
keys()
возвращает представление всех ключей в словаре.keys = my_dict.keys() # Вывод: dict_keys(['a', 'b', 'c'])
- Метод
values()
— получение значений:- Метод
values()
возвращает представление всех значений в словаре.values = my_dict.values() # Вывод: dict_values([1, 2, 3])
- Метод
pop(key, default=None)
— удаление элемента по ключу и возврат значения:- Метод
pop()
удаляет элемент по ключу и возвращает его значение. Если ключ не существует, возвращает значение по умолчанию (по умолчаниюNone
).removed_value = my_dict.pop('a', 'Ключ не существует') # Вывод: 1
- Метод
popitem()
— удаление и возврат последней пары «ключ-значение»:- Метод
popitem()
удаляет и возвращает последнюю добавленную пару «ключ-значение».last_pair = my_dict.popitem() # Вывод: ('c', 3)
- Метод
setdefault(key, default=None)
— получение значения по ключу или добавление нового:- Метод
setdefault()
возвращает значение по ключу, если ключ существует, иначе добавляет новый ключ со значением по умолчанию.value = my_dict.setdefault('d', 4) # Вывод: 4
- Метод
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}
- Метод
fromkeys(keys, value=None)
— создание словаря из ключей и значения:- Метод
fromkeys()
создает новый словарь с указанными ключами и значениями.keys = ['a', 'b', 'c'] new_dict = dict.fromkeys(keys, 0) # Вывод: {'a': 0, 'b': 0, 'c': 0}
- Метод
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}
Агрегатные функции и сортировка в словарях.
Применение агрегатных функций к словарям:
Агрегатные функции могут быть использованы для обработки значений в словаре, позволяя выполнять различные вычисления на основе этих данных. Рассмотрим несколько примеров:
- Вычисление суммы значений:
- Используя метод
sum()
, можно вычислить сумму всех значений в словаре.prices = {'яблоко': 2, 'банан': 1, 'апельсин': 3} total_price = sum(prices.values()) # Вывод: 6
- Используя метод
- Нахождение среднего значения:
- Среднее значение можно вычислить, разделив сумму значений на их количество.
average_price = total_price / len(prices) # Вывод: 2.0
- Среднее значение можно вычислить, разделив сумму значений на их количество.
- Нахождение минимального и максимального значений:
- Методы
min()
иmax()
позволяют найти минимальное и максимальное значение в словаре.min_price = min(prices.values()) max_price = max(prices.values()) # Вывод: min_price = 1, max_price = 3
- Методы
- Подсчет количества элементов:
- Функция
len()
может быть использована для подсчета количества элементов в словаре (количество ключей).num_items = len(prices) # Вывод: 3
- Функция
- Сортировка словаря по ключам и значениям:
- По ключам:
- Для сортировки словаря по ключам можно использовать функцию
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()))
# Вывод: {'Китай': 'Пекин', 'Россия': 'Москва', 'США': 'Вашингтон'}
Практические примеры использования словарей
- Словарь для хранения информации о студентах:
- Вы можете использовать словарь для хранения информации о студентах, включая их имена, оценки по различным предметам и другие данные.
students_data = { 'Иванов': {'математика': 90, 'физика': 85, 'химия': 78}, 'Петров': {'математика': 92, 'физика': 88, 'химия': 76}, 'Сидоров': {'математика': 85, 'физика': 80, 'химия': 92} }
- Вы можете использовать словарь для хранения информации о студентах, включая их имена, оценки по различным предметам и другие данные.
- Словарь для отображения рейтинга фильмов:
- Вы можете использовать словарь для создания рейтинга фильмов, где ключи — это названия фильмов, а значения — рейтинги.
movie_ratings = { 'Звездные войны': 9.0, 'Властелин колец': 8.5, 'Гарри Поттер': 8.2 }
- Вы можете использовать словарь для создания рейтинга фильмов, где ключи — это названия фильмов, а значения — рейтинги.
- Словарь для хранения настроек приложения:
- Используйте словарь для хранения настроек приложения, например, цветовую схему, размер шрифта и другие параметры.
app_settings = { 'цвет_фона': 'синий', 'размер_шрифта': 12, 'тема': 'темная' }
- Используйте словарь для хранения настроек приложения, например, цветовую схему, размер шрифта и другие параметры.
- Словарь для учета товаров на складе:
- Ведите учет товаров на складе, используя словарь, где ключи — это названия товаров, а значения — количество товаров на складе.
inventory = { 'ноутбуки': 50, 'принтеры': 20, 'мониторы': 30 }
- Ведите учет товаров на складе, используя словарь, где ключи — это названия товаров, а значения — количество товаров на складе.
- Словарь для отображения перевода слов:
- Используйте словарь для создания простого словаря, где ключи — это слова на одном языке, а значения — их перевод на другой язык.
translation_dict = { 'hello': 'привет', 'world': 'мир', 'python': 'питон' }
- Используйте словарь для создания простого словаря, где ключи — это слова на одном языке, а значения — их перевод на другой язык.
Распаковка словарей в Python
Распаковка словарей (dictionary unpacking) в Python — это механизм, который позволяет извлекать элементы из словаря. Делается это с помощью оператора
**
Распакованные пары использовать их для инициализации другого словаря или передачи аргументов функции. Этот процесс делает код более компактным и улучшает читаемость.
Основные способы использования распаковки словарей:
- Инициализация нового словаря:
dict1 = {'a': 1, 'b': 2} dict2 = {'c': 3, 'd': 4} combined_dict = {**dict1, **dict2}
В результате
combined_dict
будет содержать все элементы изdict1
иdict2
. Если ключи повторяются, значения из второго словаря перезапишут значения из первого. - Передача аргументов функции:
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)]
Индивидуальное и групповое обучение «Python Junior»
Если вы хотите научиться программировать на Python, могу помочь. Запишитесь на мой курс «Python Junior» и начните свой путь в мир ИТ уже сегодня!
Контакты
Для получения дополнительной информации и записи на курсы свяжитесь со мной:
Телеграм: https://t.me/Vvkomlev
Email: victor.komlev@mail.ru
Объясняю сложное простыми словами. Даже если вы никогда не работали с ИТ и далеки от программирования, теперь у вас точно все получится! Проверено десятками примеров моих учеников.
Гибкий график обучения. Я предлагаю занятия в мини-группах и индивидуально, что позволяет каждому заниматься в удобном темпе. Вы можете совмещать обучение с работой или учебой.
Практическая направленность. 80%: практики, 20% теории. У меня множество авторских заданий, которые фокусируются на практике. Вы не просто изучаете теорию, а сразу применяете знания в реальных проектах и задачах.
Разнообразие учебных материалов: Теория представлена в виде текстовых уроков с примерами и видео, что делает обучение максимально эффективным и удобным.
Понимаю, что обучение информационным технологиям может быть сложным, особенно для новичков. Моя цель – сделать этот процесс максимально простым и увлекательным. У меня персонализированный подход к каждому ученику. Максимальный фокус внимания на ваши потребности и уровень подготовки.