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

В чем разница между типами коллекций в Python?

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

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

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

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

Различия между типами коллекций в Python

Это одна из основ Python. Коллекции отличаются по упорядоченности, изменяемости и доступу к элементам.

List — упорядоченная изменяемая коллекция

Назначение: хранить несколько значений в определённом порядке, с возможностью изменения.

# Создание
fruits = ["apple", "banana", "cherry"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True]

# Доступ по индексу
print(fruits[0])      # apple
print(fruits[-1])     # cherry (последний элемент)
print(fruits[1:3])    # ["banana", "cherry"] (срез)

# Изменение
fruits[0] = "orange"  # Изменить элемент
fruits.append("grape")  # Добавить в конец
fruits.insert(1, "mango")  # Вставить в позицию
fruits.remove("banana")  # Удалить по значению
fruits.pop(0)  # Удалить по индексу

# Итерация
for fruit in fruits:
    print(fruit)

print(len(fruits))  # Количество элементов
print("apple" in fruits)  # Проверка наличия

Характеристики:

  • Упорядочена (порядок сохраняется)
  • Изменяемая (можно добавлять, удалять, менять)
  • Доступ по индексу за O(1)
  • Дубликаты разрешены
  • Может содержать разные типы

Tuple — упорядоченная неизменяемая коллекция

Назначение: хранить значения, которые не должны меняться. Immutable = hashable = можно использовать как ключ словаря.

# Создание
point = (10, 20)
colors = ("red", "green", "blue")
single = (42,)  # Запятая обязательна для одного элемента!
empty = ()

# Доступ по индексу (как list)
print(point[0])  # 10
print(colors[1:3])  # ("green", "blue")

# НЕЛЬЗЯ менять!
# point[0] = 15  # TypeError: 'tuple' object does not support item assignment
# colors.append("yellow")  # AttributeError

# Распаковка
x, y = point
print(f"x={x}, y={y}")

# Использование как ключ словаря
locations = {
    (0, 0): "origin",
    (1, 1): "diagonal",
    (10, 20): "point"
}
print(locations[(0, 0)])  # origin

# Возврат нескольких значений
def get_coordinates():
    return (10, 20)

x, y = get_coordinates()

Характеристики:

  • Упорядочена
  • Неизменяемая (immutable)
  • Hashable (можно использовать как ключ)
  • Доступ по индексу за O(1)
  • Дубликаты разрешены
  • Немного быстрее list

Dict — неупорядоченная пара ключ-значение

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

# Создание
person = {
    "name": "John",
    "age": 30,
    "city": "New York"
}

scores = dict(alice=85, bob=90, charlie=78)

# Доступ
print(person["name"])  # John
print(person.get("age"))  # 30
print(person.get("email", "N/A"))  # N/A (default)

# Изменение
person["age"] = 31  # Изменить
person["email"] = "john@example.com"  # Добавить
del person["city"]  # Удалить

# Итерация
for key in person:
    print(f"{key}: {person[key]}")

for key, value in person.items():
    print(f"{key}: {value}")

for value in person.values():
    print(value)

for key in person.keys():
    print(key)

# Проверка
print("name" in person)  # True
print(len(person))  # Количество пар

# Merge (Python 3.9+)
person2 = {"age": 25, "hobby": "coding"}
merged = person | person2  # {'name': 'John', 'age': 25, ...}

Характеристики:

  • Неупорядочена (в Python 3.7+ сохраняет порядок вставки)
  • Изменяемая
  • Быстрый поиск за O(1) в среднем
  • Ключи должны быть hashable (str, int, tuple)
  • Значения могут быть любыми

Set — неупорядоченная коллекция уникальных значений

Назначение: хранить только уникальные элементы. Быстрая проверка наличия.

# Создание
colors = {"red", "green", "blue"}
numbers = set([1, 2, 2, 3, 3, 3])  # Дубликаты удаляются
print(numbers)  # {1, 2, 3}

empty = set()  # Важно: {} — это пустой dict, не set

# Добавление и удаление
colors.add("yellow")
colors.remove("red")  # Ошибка, если нет
colors.discard("purple")  # Ошибка не будет

# Проверка
print("green" in colors)  # O(1) очень быстро!

# Операции с множествами
set1 = {1, 2, 3}
set2 = {2, 3, 4}

print(set1 | set2)  # Union (объединение): {1, 2, 3, 4}
print(set1 & set2)  # Intersection (пересечение): {2, 3}
print(set1 - set2)  # Difference (разность): {1}
print(set1 ^ set2)  # Symmetric diff: {1, 4}

# Итерация
for color in colors:
    print(color)  # Порядок не гарантирован

Характеристики:

  • Неупорядочена
  • Изменяемая
  • Только уникальные значения
  • Очень быстрый поиск за O(1)
  • Можно использовать для математических операций

FrozenSet — неизменяемый Set

# Неизменяемое множество
immutable_set = frozenset({1, 2, 3})

# Можно использовать как ключ словаря
sets_dict = {
    frozenset({1, 2}): "pair",
    frozenset({1, 2, 3}): "triple"
}

# Нельзя менять
# immutable_set.add(4)  # AttributeError

Сравнительная таблица

ПараметрListTupleDictSetFrozenSet
УпорядоченаДаДаНет*НетНет
ИзменяемаяДаНетДаДаНет
HashableНетДаНетНетДа
УникальностьНетНетКлючиДаДа
Доступ по индексуO(1)O(1)O(1)НетНет
Поиск элементаO(n)O(n)O(1)O(1)O(1)
ДубликатыРазрешеныРазрешеныНет (ключи)НетНет
ИспользованиеОсновнаяКортежи, ключиСвязиУникальностьНеменяемые ключи

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

# List: обработка последовательности
data = [1, 2, 3, 4, 5]
data = [x * 2 for x in data]

# Tuple: возврат нескольких значений
def divide(a, b):
    return (a // b, a % b)

quotient, remainder = divide(10, 3)

# Dict: кэширование результатов
cache = {}
def expensive_function(n):
    if n not in cache:
        cache[n] = n ** 2
    return cache[n]

# Set: удаление дубликатов
scores = [85, 90, 85, 78, 90, 95]
unique_scores = set(scores)

# Dict + List: параллельные списки
students = ["Alice", "Bob", "Charlie"]
grades = {"Alice": "A", "Bob": "B", "Charlie": "C"}

# Set операции: пересечение интересов
friends_alice = {"Bob", "Charlie", "David"}
friends_bob = {"Alice", "Charlie", "Eve"}
common = friends_alice & friends_bob  # {"Charlie"}

Когда что использовать

  • List: нужна упорядоченность и изменяемость
  • Tuple: нужна неизменяемость или ключ для dict
  • Dict: нужна связь ключ-значение
  • Set: нужна уникальность и быстрый поиск
  • FrozenSet: нужен неизменяемый set