← Назад к вопросам
В чем разница между типами коллекций в 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
Сравнительная таблица
| Параметр | List | Tuple | Dict | Set | FrozenSet |
|---|---|---|---|---|---|
| Упорядочена | Да | Да | Нет* | Нет | Нет |
| Изменяемая | Да | Нет | Да | Да | Нет |
| 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