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

Расскажи основные структуры в 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.