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

Может ли tuple с несколькими значениями использоваться как ключ в dictionary?

1.6 Junior🔥 121 комментариев
#Python Core

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

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

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

Использование tuple в качестве ключа dictionary

Да, кортежи (tuple) с несколькими значениями могут использоваться как ключи в dictionary. Это одна из важнейших особенностей Python, которая отличает кортежи от списков.

Почему tuple работают как ключи?

Для использования объекта в качестве ключа словаря в Python требуются два условия:

  1. Immutability (неизменяемость) — объект не должен изменяться после создания
  2. Hashability (хешируемость) — объект должен иметь консистентный хеш

Тuple отвечают обоим требованиям, а list — нет.

Примеры использования tuple как ключей

Базовый пример

# Tuple как ключ — работает
coordinates = {}
coordinates[(0, 0)] = "origin"
coordinates[(1, 2)] = "point"
coordinates[(-5, 10)] = "another point"

print(coordinates[(1, 2)])
print(coordinates)

Координаты и пространственные данные

cache = {}

def calculate_distance(x, y):
    key = (x, y)
    if key in cache:
        return cache[key]
    
    result = (x**2 + y**2) ** 0.5
    cache[key] = result
    return result

calculate_distance(3, 4)

Многомерные данные

voxel_data = {
    (0, 0, 0): "empty",
    (1, 1, 1): "solid",
    (2, 2, 2): "liquid",
}

user_actions = {}
user_actions[("user_123", "2024-01-15", "login")] = {"timestamp": 1234567890}

Вложенные tuple

complex_key = ((1, 2), (3, 4))
mapping = {
    complex_key: "complex structure"
}
print(mapping[((1, 2), (3, 4))])

Почему list НЕ работают как ключи?

data = {}
data[[1, 2, 3]] = "value"
my_list = [1, 2, 3]
my_list[0] = 999

Лист изменяем, поэтому использовать как ключ нельзя.

Практические случаи использования

1. Граф и связи между узлами

graph = {}
edges = [
    ((1, 2), (2, 3), "connected"),
    ((5, 6), (7, 8), "connected"),
]

for edge in edges:
    source, target = edge[0], edge[1]
    key = (source, target)
    graph[key] = edge[2]

2. Матрица результатов

test_results = {}

for test_id in range(1, 4):
    for version_id in range(1, 3):
        key = (test_id, version_id)
        test_results[key] = f"result_{test_id}_{version_id}"

3. Кеширование функций с несколькими параметрами

def memoize(func):
    cache = {}
    
    def wrapper(*args, **kwargs):
        key = (args, tuple(sorted(kwargs.items())))
        if key in cache:
            return cache[key]
        
        result = func(*args, **kwargs)
        cache[key] = result
        return result
    
    return wrapper

Важные замечания

  • Неизменяемость содержимого: Если tuple содержит изменяемый объект (например, list), tuple всё ещё технически неизменяем
  • Консистентность хеша: Значения tuple не должны изменяться
  • Производительность: Поиск по tuple-ключам имеет O(1) среднюю сложность

Таким образом, tuple — отличный выбор для создания составных ключей в словарях.