Перейти к содержимому
Editor

Словари в Python: полное руководство с реальными примерами

Начальный30 min8 упр.110 XP

Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе

0/8 упр.

Откройте контакты в телефоне. Вы ищете человека по имени и получаете его номер телефона. Вы не ищете по позиции и не думаете: «мне нужен контакт номер 47». Вы ищете по имени.

Словарь в Python работает точно так же. Вместо того чтобы хранить элементы по позициям (как список), словарь хранит их в виде пар ключ-значение. Ключ служит именем, по которому вы ищете, а значение и есть то, что вы получаете в ответ.

В реальном программировании словари повсюду. Профили пользователей, настройки, JSON-данные от API, счётчики слов: всё это словари. В этом уроке вы освоите все основные операции со словарями.

Как создать словарь в Python

Словарь создаётся с помощью фигурных скобок {}, внутри которых записываются пары ключ-значение, где ключ отделён от значения двоеточием. Сами пары разделяются запятыми.

Создание словаря
# A simple dictionary
contact = {
'name': 'Alice',
'phone': '555-1234',
'email': 'alice@example.com',
}
print(contact)
Вывод
{'name': 'Alice', 'phone': '555-1234', 'email': 'alice@example.com'}

Ключами обычно служат строки, но подойдёт любой неизменяемый тип: числа, кортежи или логические значения. Значения могут быть какими угодно: строками, числами, списками и даже другими словарями.

Значения разных типов и пустые словари
# Different types of keys and values
student = {
'name': 'Bob',
'age': 16,
'grades': [85, 92, 78],
'active': True,
}
print(student)
# Empty dictionary - two ways
empty1 = {}
empty2 = dict()
print(empty1) # {}
print(empty2) # {}
Вывод
{'name': 'Bob', 'age': 16, 'grades': [85, 92, 78], 'active': True}
{}
{}

Получение и изменение значений в словаре

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

Получение, изменение и добавление значений
person = {'name': 'Alice', 'age': 25, 'city': 'Boston'}
# Access a value by key
print(person['name']) # Alice
print(person['age']) # 25
# Change an existing value
person['age'] = 26
print(person['age']) # 26
# Add a new key-value pair
person['job'] = 'Engineer'
print(person)
Вывод
Alice
25
26
{'name': 'Alice', 'age': 26, 'city': 'Boston', 'job': 'Engineer'}
Безопасный доступ через get()
person = {'name': 'Alice', 'age': 25}
# This would crash:
# print(person['salary']) # KeyError!
# Safe way: use .get() with a default value
print(person.get('salary', 'Not specified')) # Not specified
print(person.get('name', 'Unknown')) # Alice
Вывод
Not specified
Alice
Небезопасно: без нужного ключа квадратные скобки дают ошибку
data = {'x': 10}
# Crashes with KeyError:
value = data['y']
Безопасно: get() возвращает значение по умолчанию
data = {'x': 10}
# Returns 0 if 'y' is missing:
value = data.get('y', 0)

Основные методы словарей

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

keys(), values() и items()
fruit_prices = {'apple': 1.50, 'banana': 0.75, 'cherry': 3.00}
# keys() - get all keys
print(list(fruit_prices.keys())) # ['apple', 'banana', 'cherry']
# values() - get all values
print(list(fruit_prices.values())) # [1.5, 0.75, 3.0]
# items() - get all key-value pairs as tuples
print(list(fruit_prices.items())) # [('apple', 1.5), ('banana', 0.75), ('cherry', 3.0)]
Вывод
['apple', 'banana', 'cherry']
[1.5, 0.75, 3.0]
[('apple', 1.5), ('banana', 0.75), ('cherry', 3.0)]
pop() и update()
inventory = {'apples': 5, 'bananas': 3, 'oranges': 8}
# pop() - remove a key and return its value
removed = inventory.pop('bananas')
print(removed) # 3
print(inventory) # {'apples': 5, 'oranges': 8}
# update() - merge another dictionary into this one
inventory.update({'grapes': 12, 'apples': 10})
print(inventory) # {'apples': 10, 'oranges': 8, 'grapes': 12}
Вывод
3
{'apples': 5, 'oranges': 8}
{'apples': 10, 'oranges': 8, 'grapes': 12}

Обратите внимание: update() и добавляет новые ключи, и перезаписывает существующие. В примере выше значение 'apples' изменилось с 5 на 10, а 'grapes' добавился как новый ключ.

Перебор словарей

Перебирать можно ключи словаря, его значения или и то и другое. Чаще всего перебирают items(), чтобы сразу получать и ключ, и значение.

Три способа перебрать словарь
scores = {'Alice': 95, 'Bob': 87, 'Charlie': 72}
# Loop through keys (default)
for name in scores:
print(name)
print('---')
# Loop through values
for score in scores.values():
print(score)
print('---')
# Loop through both (most useful)
for name, score in scores.items():
print(f'{name}: {score}')
Вывод
Alice
Bob
Charlie
---
95
87
72
---
Alice: 95
Bob: 87
Charlie: 72

Как проверить, есть ли ключ в словаре

Прежде чем обращаться к ключу, часто нужно проверить, существует ли он. Ключевое слово in проверяет ключи, а не значения.

Проверка ключей с помощью in
user = {'name': 'Alice', 'email': 'alice@example.com'}
# Check if a key exists
print('name' in user) # True
print('phone' in user) # False
print('phone' not in user) # True
# Common pattern: check before accessing
if 'email' in user:
print(f'Email: {user["email"]}')
else:
print('No email on file')
Вывод
True
False
True
Email: alice@example.com

Вложенные словари

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

Вложенные словари
classroom = {
'Alice': {'age': 16, 'grade': 'A'},
'Bob': {'age': 15, 'grade': 'B'},
'Charlie': {'age': 16, 'grade': 'A'},
}
# Access a nested value with chained brackets
print(classroom['Alice']['grade']) # A
print(classroom['Bob']['age']) # 15
# Loop through nested data
for name, info in classroom.items():
print(f'{name} is {info["age"]} and got a {info["grade"]}')
Вывод
A
15
Alice is 16 and got a A
Bob is 15 and got a B
Charlie is 16 and got a A

Чтобы получить вложенное значение, поставьте квадратные скобки друг за другом: сначала внешний ключ, затем внутренний. Вкладывать словари можно сколько угодно глубоко, но больше двух-трёх уровней читать уже трудно.

Частые ошибки при работе со словарями

Кортежи в качестве ключей словаря
# This works - tuples are immutable
locations = {
(40.71, -74.00): 'New York',
(51.50, -0.12): 'London',
}
print(locations[(40.71, -74.00)]) # New York
# This would crash:
# bad = {[1, 2]: 'nope'} # TypeError: unhashable type: 'list'
Вывод
New York
Ошибка: изменение во время цикла
data = {'a': 1, 'b': 2, 'c': 3}
for key in data:
    if data[key] < 2:
        del data[key]  # RuntimeError!
Работает: перебор копии ключей
data = {'a': 1, 'b': 2, 'c': 3}
for key in list(data.keys()):
    if data[key] < 2:
        del data[key]  # Safe!
print(data)  # {'b': 2, 'c': 3}

Практические упражнения

Пора потренироваться! Упражнения идут от простых операций со словарями к более сложным приёмам.

Упражнение 1: создайте словарь и получите значение
Напишите код

Создайте словарь pet с такими парами ключ-значение:

  • 'name': 'Buddy'
  • 'species': 'dog'
  • 'age': 5
  • Затем выведите кличку питомца.

    Ожидаемый вывод:

    Buddy
    # Create the pet dictionary
    # Print the pet's name
    Упражнение 2: добавьте и измените записи в словаре
    Напишите код

    Дан словарь, который описывает книгу. Выполните по порядку:

    1. Измените 'year' на 2024

    2. Добавьте новый ключ 'genre' со значением 'fiction'

    3. Выведите весь словарь

    Ожидаемый вывод:

    {'title': 'The Great Adventure', 'author': 'Jane Smith', 'year': 2024, 'genre': 'fiction'}
    book = {'title': 'The Great Adventure', 'author': 'Jane Smith', 'year': 2020}
    # Step 1: Change the year to 2024
    # Step 2: Add genre
    # Step 3: Print the dictionary
    Упражнение 3: безопасный доступ через get()
    Напишите код

    Дан словарь с профилем пользователя. С помощью метода .get() безопасно выведите номер телефона пользователя. Если ключа 'phone' нет, выведите 'No phone number'.

    Ожидаемый вывод:

    No phone number
    profile = {'name': 'Alice', 'email': 'alice@mail.com'}
    # Use .get() to safely access the phone key
    Упражнение 4: переберите словарь
    Напишите код

    Переберите словарь и выведите каждый фрукт и его цену в таком формате:

    apple: $1.50
    banana: $0.75
    cherry: $3.00

    Цены должны выводиться ровно с двумя знаками после точки.

    prices = {'apple': 1.5, 'banana': 0.75, 'cherry': 3.0}
    # Loop and print each item
    Упражнение 5: предскажите вывод (повторяющиеся ключи)
    Угадайте вывод

    Внимательно прочитайте код и предскажите, что он выведет. Что происходит, когда в словаре есть повторяющиеся ключи?

    Впишите вывод точно в том виде, в каком его напечатает Python.

    data = {'a': 1, 'b': 2, 'a': 3}
    print(data)
    print(len(data))
    Упражнение 6: исправьте ошибку в поиске значения
    Исправьте ошибку

    Этот код пытается проверить, есть ли в словаре оценка 'A', но проверяет не то. Исправьте его, чтобы он выводил:

    Someone got an A!
    grades = {'Alice': 'A', 'Bob': 'B', 'Charlie': 'C'}
    if 'A' in grades:
    print('Someone got an A!')
    else:
    print('No one got an A.')
    Упражнение 7: счётчик слов
    Напишите код

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

    Ожидаемый вывод:

    {'hello': 3, 'world': 2, 'python': 1}
    words = ['hello', 'world', 'hello', 'python', 'hello', 'world']
    # Build a word count dictionary
    # Print the result
    Упражнение 8: данные во вложенном словаре
    Напишите код

    Дан вложенный словарь с учениками. Переберите всех учеников и выведите имя каждого и его балл по математике в таком формате:

    Alice: 95
    Bob: 82
    Charlie: 91
    students = {
    'Alice': {'math': 95, 'english': 88},
    'Bob': {'math': 82, 'english': 90},
    'Charlie': {'math': 91, 'english': 85},
    }
    # Loop and print each student's math score

    Итоги: что вы узнали о словарях в Python

    Отличная работа! Вот краткий обзор всего, что вы теперь знаете:

    ПонятиеЧто делаетПример
    Создание словаряХранит пары ключ-значениеd = {'name': 'Alice'}
    Доступ по ключуПолучает значениеd['name']
    Безопасный доступЗначение по умолчанию, если ключа нетd.get('x', 0)
    Добавление и изменениеЗадаёт значениеd['age'] = 25
    keys()Все ключиd.keys()
    values()Все значенияd.values()
    items()Кортежи ключ-значениеd.items()
    pop(key)Удаляет и возвращает значениеd.pop('age')
    update()Объединяет словариd.update(other)
    inПроверяет, есть ли ключ'name' in d
    ВложенностьСловари внутри словарейd['a']['b']

    Словари входят в число важнейших структур данных в Python. Данные в формате JSON, ответы API, файлы настроек, счётчики: всё это держится на парах ключ-значение.

    Что дальше?

    В следующем уроке, [Включения в Python](/python/python-comprehensions), вы научитесь создавать списки, словари и множества одной изящной строкой кода.

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

    Похожие уроки

    Урок был полезен?