← Назад к вопросам

Что такое Словарь?

1.0 Junior🔥 221 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое словарь в Python

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

Основная концепция

Словарь — это неупорядоченная коллекция (хотя с Python 3.7+ сохраняет порядок вставки) мутабельных пар ключ-значение.

# Создание пустого словаря
empty_dict = {}

# Создание словаря с данными
person = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York',
    'email': 'john@example.com'
}

# Доступ к значениям по ключу
print(person['name'])      # John Doe
print(person.get('age'))   # 30

# Проверка наличия ключа
if 'name' in person:
    print("Name exists")   # Name exists

Создание словарей

Способ 1: Литерал с фигурными скобками

# Простой способ
student = {
    'id': 1,
    'name': 'Alice',
    'grades': [85, 90, 88]
}

Способ 2: Конструктор dict()

# Из пар ключ-значение
config = dict(host='localhost', port=5432, debug=True)

# Из списка кортежей
data = dict([('a', 1), ('b', 2), ('c', 3)])

# Из другого словаря
copy_dict = dict(original_dict)

Способ 3: Методы для создания

# Создать словарь с дефолтными значениями
default_dict = dict.fromkeys(['x', 'y', 'z'], 0)
# {'x': 0, 'y': 0, 'z': 0}

# Использовать список ключей
keys = ['name', 'age', 'email']
values = ['John', 30, 'john@example.com']
user = dict(zip(keys, values))
# {'name': 'John', 'age': 30, 'email': 'john@example.com'}

Основные операции

Добавление и обновление

person = {'name': 'John'}

# Добавление новой пары
person['age'] = 30

# Обновление существующей пары
person['name'] = 'Jane'

# Использование метода update()
person.update({'city': 'Boston', 'job': 'Engineer'})
# person = {'name': 'Jane', 'age': 30, 'city': 'Boston', 'job': 'Engineer'}

# Использование setdefault() — добавит только если ключа нет
person.setdefault('age', 25)  # Не изменит, так как 'age' уже есть
person.setdefault('email', 'jane@example.com')  # Добавит

Доступ к значениям

data = {'a': 1, 'b': 2, 'c': 3}

# Способ 1: Квадратные скобки (вызовет KeyError если ключа нет)
value = data['a']  # 1
value = data['x']  # KeyError: 'x'

# Способ 2: Метод get() (безопаснее)
value = data.get('a')  # 1
value = data.get('x')  # None
value = data.get('x', 'default')  # default

# Способ 3: pop() — получить и удалить
value = data.pop('a')  # 1, удалит 'a' из словаря
value = data.pop('x', 'not found')  # not found

Удаление элементов

person = {'name': 'John', 'age': 30, 'email': 'john@example.com'}

# Способ 1: del
del person['age']
# person = {'name': 'John', 'email': 'john@example.com'}

# Способ 2: pop()
person.pop('email')

# Способ 3: popitem() — удалить последнюю пару
last_key, last_value = person.popitem()

# Способ 4: clear() — удалить все элементы
person.clear()
# person = {}

Итерация по словарю

user = {'name': 'John', 'age': 30, 'city': 'Boston'}

# Итерация по ключам
for key in user:
    print(key)  # name, age, city

# Итерация по ключам (явно)
for key in user.keys():
    print(key)

# Итерация по значениям
for value in user.values():
    print(value)  # John, 30, Boston

# Итерация по парам ключ-значение
for key, value in user.items():
    print(f"{key}: {value}")
    # name: John
    # age: 30
    # city: Boston

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

# Словарь словарей
company = {
    'employees': {
        'john': {'age': 30, 'salary': 50000},
        'jane': {'age': 28, 'salary': 55000}
    },
    'name': 'TechCorp',
    'founded': 2010
}

# Доступ к вложенным данным
print(company['employees']['john']['age'])  # 30

# Безопасный доступ к вложенным данным
age = company.get('employees', {}).get('john', {}).get('age')  # 30

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

data = {'a': 1, 'b': 2}

# keys() — получить все ключи
keys = data.keys()  # dict_keys(['a', 'b'])
keys_list = list(data.keys())  # ['a', 'b']

# values() — получить все значения
values = data.values()  # dict_values([1, 2])
values_list = list(data.values())  # [1, 2]

# items() — получить пары ключ-значение
items = data.items()  # dict_items([('a', 1), ('b', 2)])
items_list = list(data.items())  # [('a', 1), ('b', 2)]

# copy() — поверхностная копия
copy_data = data.copy()

# update() — обновить несколько значений
data.update({'c': 3, 'd': 4})

Практические примеры

Подсчёт частоты элементов

words = ['apple', 'banana', 'apple', 'cherry', 'banana', 'apple']
freq = {}

for word in words:
    freq[word] = freq.get(word, 0) + 1

print(freq)  # {'apple': 3, 'banana': 2, 'cherry': 1}

Использование словаря как кэша

cache = {}

def fibonacci(n):
    if n in cache:
        return cache[n]
    
    if n <= 1:
        result = n
    else:
        result = fibonacci(n-1) + fibonacci(n-2)
    
    cache[n] = result
    return result

print(fibonacci(10))  # Намного быстрее со вторым вызовом

Преобразование JSON

import json

# Преобразование словаря в JSON
user_dict = {'name': 'John', 'age': 30}
json_string = json.dumps(user_dict)
print(json_string)  # {"name": "John", "age": 30}

# Преобразование JSON в словарь
json_data = '{"name": "Jane", "age": 25}'
user_dict = json.loads(json_data)
print(user_dict)  # {'name': 'Jane', 'age': 25}

Сортировка словаря

data = {'c': 3, 'a': 1, 'b': 2}

# Сортировка по ключам
sorted_by_keys = dict(sorted(data.items()))
# {'a': 1, 'b': 2, 'c': 3}

# Сортировка по значениям
sorted_by_values = dict(sorted(data.items(), key=lambda x: x[1]))
# {'a': 1, 'b': 2, 'c': 3}

# Сортировка по значениям в обратном порядке
reverse_sorted = dict(sorted(data.items(), key=lambda x: x[1], reverse=True))
# {'c': 3, 'b': 2, 'a': 1}

Ключи словаря

Ключи должны быть неизменяемыми (immutable):

# Допустимые ключи
valid = {
    'string': 1,
    42: 'number',
    (1, 2): 'tuple',
    True: 'boolean'
}

# Недопустимые ключи
invalid = {
    [1, 2]: 'list',  # TypeError: unhashable type: 'list'
    {'a': 1}: 'dict'  # TypeError: unhashable type: 'dict'
}

Производительность

Словари — это хеш-таблицы, поэтому операции имеют среднюю временную сложность O(1):

import time

data = {str(i): i for i in range(1000000)}

# O(1) — быстро
start = time.time()
value = data['999999']
print(f"Lookup: {time.time() - start:.6f}s")

# O(n) — медленно (для сравнения)
list_data = list(data.items())
start = time.time()
for k, v in list_data:
    if k == '999999':
        break
print(f"List lookup: {time.time() - start:.6f}s")

Особенности Python 3.7+

С Python 3.7 словари гарантированно сохраняют порядок вставки элементов:

data = {}
data['z'] = 26
data['a'] = 1
data['m'] = 13

for key in data:
    print(key)  # z, a, m (в порядке вставки, не алфавитном)

Словари vs другие структуры

┌──────────────┬─────────┬────────┬──────────┬────────┐
│              │ Dict    │ List   │ Tuple    │ Set    │
├──────────────┼─────────┼────────┼──────────┼────────┤
│ Доступ       │ O(1)    │ O(n)   │ O(n)     │ O(1)   │
│ Вставка      │ O(1)    │ O(n)   │ N/A      │ O(1)   │
│ Удаление     │ O(1)    │ O(n)   │ N/A      │ O(1)   │
│ Мутабельный  │ Да      │ Да     │ Нет      │ Да     │
│ Ключи        │ Разные  │ Индекс │ Индекс   │ Значен │
└──────────────┴─────────┴────────┴──────────┴────────┘

Заключение

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

Что такое Словарь? | PrepBro