Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое словарь в 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 программиста.