← Назад к вопросам
Расскажи основные структуры в Python
2.0 Middle🔥 251 комментариев
#DevOps и инфраструктура#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Ответ: Основные структуры данных в Python
В Python есть встроенные структуры данных, которые решают 99% практических задач. Давай разберемся с каждой.
1. List (Список) — упорядоченная коллекция
Характеристики
- Упорядочена — элементы идут в определённом порядке
- Изменяемая (mutable) — можно добавлять, удалять, менять
- Индексируется — доступ по позиции
- Может содержать разные типы — [1, "str", 3.14]
Примеры
# Создание
users = ["John", "Jane", "Bob"]
# Добавление
users.append("Alice") # ["John", "Jane", "Bob", "Alice"]
# Доступ по индексу
first = users[0] # "John"
last = users[-1] # "Alice" (с конца)
# Итерация
for user in users:
print(user)
# List comprehension
squares = [x**2 for x in range(10)] # [0, 1, 4, 9, 16, ...]
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# Срезы
first_two = users[:2] # ["John", "Jane"]
last_two = users[-2:] # ["Bob", "Alice"]
middle = users[1:3] # ["Jane", "Bob"]
Когда использовать
- Коллекция элементов одного типа
- Нужен порядок элементов
- Часто меняется (добавляются/удаляются элементы)
2. Tuple (Кортеж) — неизменяемый список
Характеристики
- Упорядочена — как list
- Неизменяемая (immutable) — нельзя менять после создания
- Индексируется — как list
- Легче в памяти — быстрее, чем list
Примеры
# Создание
point = (10, 20)
rgb = (255, 128, 0)
empty = ()
single = (42,) # запятая нужна для одного элемента!
# Доступ
x, y = point # распаковка: x=10, y=20
# Нельзя менять
# point[0] = 15 # TypeError!
# Хеширование (может быть ключом словаря)
locations = {
(0, 0): "origin",
(10, 20): "point A"
}
# Функция возвращает несколько значений (на самом деле tuple)
def get_user_info():
return "John", 30, "john@example.com"
name, age, email = get_user_info()
Когда использовать
- Коллекция которая не должна меняться
- Ключ словаря (tuple, не list)
- Возврат нескольких значений из функции
- Немного лучше производительность, чем list
3. Dictionary (Словарь) — ключ-значение
Характеристики
- Неупорядочена (в Python 3.7+ упорядочена по порядку добавления)
- Изменяемая — можно добавлять/удалять ключи
- Быстрый поиск — O(1) по ключу
- Гибкая структура — разные значения для разных ключей
Примеры
# Создание
user = {
"name": "John",
"age": 30,
"email": "john@example.com",
"is_active": True
}
# Доступ
name = user["name"] # "John"
age = user.get("age", 0) # 30 (с дефолтом)
# Добавление
user["city"] = "New York"
# Удаление
del user["city"]
user.pop("age") # и вернуть значение
# Итерация
for key, value in user.items():
print(f"{key}: {value}")
for key in user.keys():
print(key)
for value in user.values():
print(value)
# Проверка наличия ключа
if "email" in user:
print(user["email"])
# Слияние (Python 3.9+)
more_data = {"country": "USA", "age": 31}
user = {**user, **more_data}
# Dict comprehension
squares = {x: x**2 for x in range(5)} # {0: 0, 1: 1, 2: 4, ...}
Когда использовать
- Хранение данных с названиями (JSON-like)
- Кэширование (ключ -> значение)
- Счётчики элементов
- Быстрый поиск по ключу
4. Set (Множество) — уникальные элементы
Характеристики
- Неупорядочена — нет индексов
- Изменяемая — можно добавлять/удалять
- Уникальные элементы — дубликаты удаляются
- Быстрая проверка принадлежности — O(1)
Примеры
# Создание
colors = {"red", "green", "blue"}
unique_numbers = set([1, 2, 2, 3, 3, 3]) # {1, 2, 3}
# Добавление
colors.add("yellow")
# Удаление
colors.remove("red") # ошибка если нет
colors.discard("red") # нет ошибки
# Проверка принадлежности
if "red" in colors:
print("Red is in colors")
# Операции с множествами
a = {1, 2, 3}
b = {3, 4, 5}
union = a | b # {1, 2, 3, 4, 5} объединение
intersection = a & b # {3} пересечение
difference = a - b # {1, 2} разница
# Практический пример: найти уникальные IP адреса
ip_logs = ["192.168.1.1", "192.168.1.2", "192.168.1.1", "192.168.1.3"]
unique_ips = set(ip_logs) # {"192.168.1.1", "192.168.1.2", "192.168.1.3"}
Когда использовать
- Уникальные элементы
- Быстрая проверка наличия элемента
- Удаление дубликатов
- Операции с множествами (объединение, пересечение)
5. Строки (String) — текст
Характеристики
- Неизменяемая (immutable)
- Последовательность символов — как tuple
- Методы манипуляции текстом
Примеры
# Создание
text = "Hello, World!"
multiline = """Line 1
Line 2
Line 3"""
# Методы
text.lower() # "hello, world!"
text.upper() # "HELLO, WORLD!"
text.replace("World", "Python") # "Hello, Python!"
text.split(",") # ["Hello", " World!"]
# Форматирование (f-strings)
name = "John"
age = 30
message = f"My name is {name} and I'm {age} years old"
# Форматирование (старый способ)
message = "My name is {} and I'm {} years old".format(name, age)
# Срезы (как у list)
first_5 = text[:5] # "Hello"
last_5 = text[-5:] # "orld!"
6. Frozenset — неизменяемое множество
Характеристики
- Как set, но неизменяемый
- Может быть ключом словаря
- Редко используется
immutable_set = frozenset({1, 2, 3})
# immutable_set.add(4) # AttributeError
# Можно использовать как ключ
sets_dict = {
frozenset({1, 2}): "pair",
frozenset({3, 4}): "another pair"
}
Выбор структуры
| Структура | Упорядочена | Изменяемая | Уникальные | Поиск | Используй для |
|---|---|---|---|---|---|
| list | Да | Да | Нет | O(n) | Коллекция элементов |
| tuple | Да | Нет | Нет | O(n) | Значения функции, ключи dict |
| dict | Да* | Да | Ключи | O(1) | ключ -> значение |
| set | Нет | Да | Да | O(1) | Уникальность, операции |
| str | Да | Нет | Нет | O(n) | Текст |
| frozenset | Нет | Нет | Да | O(1) | Ключи dict (редко) |
Производительность
# Поиск в коллекции
import time
my_list = list(range(1_000_000))
my_set = set(range(1_000_000))
my_dict = {i: i for i in range(1_000_000)}
# Поиск элемента 999999
start = time.time()
999999 in my_list # медленно: проверит почти миллион элементов
print(f"list: {time.time() - start:.6f}s") # ~0.01s
start = time.time()
999999 in my_set # быстро: O(1)
print(f"set: {time.time() - start:.6f}s") # ~0.0001s (в 100 раз быстрее!)
start = time.time()
999999 in my_dict # быстро: O(1)
print(f"dict: {time.time() - start:.6f}s") # ~0.0001s
Практический совет
# Используй правильную структуру
# ❌ Плохо
ids = [1, 2, 3, 4, 5]
if id in ids: # O(n) поиск
...
# ✓ Хорошо
ids = {1, 2, 3, 4, 5}
if id in ids: # O(1) поиск
...
# ❌ Плохо
user_data = [("name", "John"), ("age", 30)]
for key, value in user_data:
if key == "age":
print(value) # O(n)
# ✓ Хорошо
user_data = {"name": "John", "age": 30}
print(user_data["age"]) # O(1)
Итог
- list — основная рабочая лошадка
- dict — для структурированных данных (JSON, конфиги)
- set — для проверки наличия элемента и уникальности
- tuple — для неизменяемых данных и возврата из функций
- str — для текста (но помни что immutable)
Эти шесть структур покрывают 99% задач в Python. Выбирай правильную для своего use case.