Python словари: примеры использования пар ключ и значение
Основные операции со словарями
Базовое создание и доступ к элементам
Наиболее распространённый и эффективный способ работы со словарём в Python - использование литерала {} с парами ключ:значение. Доступ к значению выполняется через квадратные скобки d[key] или метод get(), который возвращает None (или заданное значение по умолчанию) при отсутствии ключа.
# Создание словаря
phonebook = {
"Alice": "123-456",
"Bob": "987-654",
"Charlie": "555-000"
}
# Доступ через квадратные скобки
alice_phone = phonebook["Alice"]
print(alice_phone) # 123-456
# Безопасный доступ с get
tom_phone = phonebook.get("Tom", "не найден")
print(tom_phone) # не найден
# Добавление новой пары
phonebook["Diana"] = "333-777"
# Обновление существующего значения
phonebook["Bob"] = "111-222"
# Удаление пары
del phonebook["Charlie"]
print(phonebook)
# {'Alice': '123-456', 'Bob': '111-222', 'Diana': '333-777'}словарь слов python (словарь слов в python)
Ключи и значения
Ключи должны быть неизменяемыми типами (строки, числа, кортежи), значения - любыми объектами. При попытке обратиться к несуществующему ключу через скобки возникает KeyError.
Типичные ошибки и способы их решения
- Ошибка:
KeyErrorпри обращении к несуществующему ключу. Решение: использоватьget()с запасным значением или проверять наличие ключа операторомin. - Ошибка: попытка использовать изменяемый тип (список, другой словарь) в качестве ключа. Решение: преобразовать в кортеж или использовать хешируемый тип.
- Ошибка: изменение словаря во время итерации по его ключам. Решение: создавать копию списка ключей
list(dict.keys())или использовать обёрткуlist(dict).
Как создать словарь из последовательности пар?
Если пары ключ-значение хранятся в виде списка кортежей, применяется функция dict().
pairs = [("яблоко", 5), ("груша", 3)]
fruit_basket = dict(pairs)
print(fruit_basket) # {'яблоко': 5, 'груша': 3}Python значение ключа словаря (значение ключа словаря в python)
Возможные трудности:
Повторяющиеся ключи - последнее значение перезаписывает предыдущие.
Как объединить два списка в словарь (ключи и значения)?
Функция zip() соединяет два итерируемых объекта в пары.
keys = ["a", "b", "c"]
values = [1, 2, 3]
result = dict(zip(keys, values))
print(result) # {'a': 1, 'b': 2, 'c': 3}
ключ значение в python (пары ключ-значение в python)
Как задать значение по умолчанию для отсутствующих ключей?
Использование defaultdict из модуля collections позволяет автоматически создавать отсутствующий ключ с фабрикой значений.
from collections import defaultdict
# каждое отсутствующее значение становится списком
groups = defaultdict(list)
colors = [("фрукт", "красный"), ("фрукт", "зелёный"), ("овощ", "жёлтый")]
for category, color in colors:
groups[category].append(color)
print(groups)
# defaultdict(<class 'list'>, {'фрукт': ['красный', 'зелёный'], 'овощ': ['жёлтый']})получить значение ключа python (получение значения ключа в python)
Предостережение:
defaultdict при обращении к несуществующему ключу создаёт запись, что может привести к нежелательному заполнению словаря. Для проверки без создания применяйте get() или in.
Как сохранить порядок добавления ключей?
В Python 3.7+ обычные словари уже сохраняют порядок вставки. Для обратной совместимости или явного указания можно использовать OrderedDict.
from collections import OrderedDict
ordered = OrderedDict()
ordered["первый"] = 1
ordered["второй"] = 2
ordered["третий"] = 3
print(ordered)
# OrderedDict([('первый', 1), ('второй', 2), ('третий', 3)])Python получить ключ (получение ключа словаря в python)
Как подсчитать количество повторяющихся элементов?
Специализированный класс Counter из collections ведёт подсчёт и предоставляет дополнительные методы.
from collections import Counter
words = ["яблоко", "груша", "яблоко", "банан", "груша", "яблоко"]
counts = Counter(words)
print(counts) # Counter({'яблоко': 3, 'груша': 2, 'банан': 1})
# Топ-2 самых частых
print(counts.most_common(2)) # [('яблоко', 3), ('груша', 2)]словарь значения python (словарь значений в python)
Как объединить несколько словарей в один?
Начиная с Python 3.9 применяется оператор |. Ранее использовался {**d1, **d2} или dict(d1, **d2).
d1 = {"a": 1, "b": 2}
d2 = {"b": 3, "c": 4}
# Оператор слияния
merged = d1 | d2
print(merged) # {'a': 1, 'b': 3, 'c': 4}
# Распаковка
merged2 = {**d1, **d2}
print(merged2) # {'a': 1, 'b': 3, 'c': 4}список значений словаря python (список значений словаря в python)
Внимание:
При совпадении ключей приоритет имеет правый словарь.
Как добавить значение, если ключ отсутствует, иначе не менять?
Метод setdefault() устанавливает значение для ключа только если его ещё нет, и возвращает текущее значение.
d = {"x": 10}
d.setdefault("y", []).append(1) # создаст 'y': [1]
d.setdefault("x", 0).append(2) # ошибка, потому что 'x' - число; на практике это не append
print(d) # {'x': 10, 'y': [1]}удаление словаря python (удаление элемента из словаря в python)
Как пройти по всем парам ключ-значение?
Метод items() возвращает итератор кортежей (ключ, значение).
d = {"a": 1, "b": 2}
for key, value in d.items():
print(f"{key} = {value}")
# a = 1
# b = 2Аналогично keys() и values() для отдельных компонентов.
Расширенные примеры работы со словарями
Генератор словаря с условиями
Словари можно создавать с помощью включения (dict comprehension), например, фильтруя данные.
# Словарь из последовательности, где значения больше 10
numbers = [5, 12, 7, 18, 3]
big_numbers = {num: num**2 for num in numbers if num > 10}
print(big_numbers) # {12: 144, 18: 324}{12: 144, 18: 324}Преобразование ключей и значений
Можно инвертировать словарь, если значения являются хешируемыми.
original = {"a": 1, "b": 2, "c": 3}
inverted = {value: key for key, value in original.items()}
print(inverted) # {1: 'a', 2: 'b', 3: 'c'}Проблема: если значения повторяются, последний ключ выигрывает. Для сохранения всех ключей можно использовать defaultdict(list).
from collections import defaultdict
original = {"a": 1, "b": 2, "c": 1}
inv = defaultdict(list)
for k, v in original.items():
inv[v].append(k)
print(dict(inv)) # {1: ['a', 'c'], 2: ['b']}Сортировка словаря по ключам или значениям
Словарь сам по себе не сортируется, можно получить отсортированный список пар.
d = {"banana": 3, "apple": 1, "cherry": 2}
# По ключам
sorted_by_key = dict(sorted(d.items()))
print(sorted_by_key) # {'apple': 1, 'banana': 3, 'cherry': 2}
# По значениям
sorted_by_value = dict(sorted(d.items(), key=lambda item: item[1]))
print(sorted_by_value) # {'apple': 1, 'cherry': 2, 'banana': 3}Распаковка словаря в аргументы функции
Оператор ** передаёт пары ключ-значение как именованные аргументы.
def greet(name, age):
return f"{name} is {age} years old"
info = {"name": "Anna", "age": 25}
print(greet(**info)) # Anna is 25 years oldВложенные словари и доступ к глубоким уровням
Для безопасного доступа к вложенным ключам можно написать рекурсивную функцию или использовать get() цепочкой.
data = {
"users": {
"alice": {"age": 30, "city": "Moscow"},
"bob": {"age": 25}
}
}
# Безопасное получение возраста alice
alice_age = data.get("users", {}).get("alice", {}).get("age", "unknown")
print(alice_age) # 30
# Если ключа нет
bob_city = data.get("users", {}).get("bob", {}).get("city", "unknown")
print(bob_city) # unknownСловарь как кэш (мемоизация)
Словарь может сохранять результаты вызовов функций для ускорения.
def fib(n, cache={}):
if n in cache:
return cache[n]
if n < 2:
return n
cache[n] = fib(n-1, cache) + fib(n-2, cache)
return cache[n]
print(fib(50)) # 12586269025 (быстро благодаря кэшу)Преобразование словаря в JSON и обратно
import json
data = {"name": "Python", "version": 3.11, "features": ["dynamic", "interpreted"]}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print(json_str)
'''
{
"name": "Python",
"version": 3.11,
"features": [
"dynamic",
"interpreted"
]
}
'''
# Обратно
loaded = json.loads(json_str)
print(loaded == data) # TrueИспользование chainmap для объединения словарей без создания нового
from collections import ChainMap
base = {"x": 1, "y": 2}
override = {"y": 3, "z": 4}
combined = ChainMap(override, base)
print(combined["x"]) # 1 (из base)
print(combined["y"]) # 3 (первый найденный из override)
print(combined["z"]) # 4
# Изменения влияют на первый словарь
combined["x"] = 10
print(override) # {'y': 3, 'z': 4, 'x': 10}Словари с ключами, являющимися кортежами
coords = {(0, 0): "начало", (1, 0): "право", (0, -1): "вниз"}
print(coords[(0, 0)]) # началоКортежи могут содержать только хешируемые элементы. Если ключ содержит список, возникает ошибка TypeError: unhashable type: 'list'.