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

Какие знаешь контейнерные типы данных Python?

1.0 Junior🔥 231 комментариев
#Python

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

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

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

Контейнерные типы данных в Python

Контейнеры (Collections/Containers) — это структуры данных, которые хранят коллекции элементов. Python предоставляет несколько встроенных и импортируемых типов контейнеров, каждый с уникальными характеристиками.

1. List (Список)

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

  • Упорядоченная, изменяемая коллекция
  • Может содержать элементы разных типов
  • Индексируется с 0
  • Использует динамический массив
# Создание
my_list = [1, 2, 'three', 4.0, None]
my_list = list('abc')  # ['a', 'b', 'c']
my_list = [x for x in range(5)]  # [0, 1, 2, 3, 4]

# Операции - O(1)
my_list[0]  # Доступ по индексу
my_list.append(5)  # Добавление в конец

# Операции - O(n)
my_list.insert(0, 'first')  # Вставка в начало
my_list.remove(2)  # Удаление значения
my_list.pop(1)  # Удаление и возврат

# Срезы
my_list[1:3]  # Элементы с индекса 1 до 3
my_list[::-1]  # Разворот
my_list[::2]  # Каждый второй элемент

# Итерация
for item in my_list:
    print(item)

Применение в Data Science:

import pandas as pd
from sklearn.model_selection import train_test_split

# Список фильтров для обработки
filters = ['drop_nulls', 'normalize', 'remove_outliers']

# Список моделей для обучения
models = [DecisionTreeClassifier(), RandomForestClassifier(), XGBClassifier()]

# Сохранение результатов
results = []
for model in models:
    score = model.fit(X_train, y_train).score(X_test, y_test)
    results.append(score)

2. Tuple (Кортеж)

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

  • Упорядоченная, неизменяемая коллекция
  • Быстрее list (меньше памяти, нет динамического расширения)
  • Может использоваться как ключ в dict или элемент set
  • Используется для return multiple values
# Создание
my_tuple = (1, 2, 3)
my_tuple = 1, 2, 3  # Скобки опциональны
single_element = (1,)  # Важна запятая!
empty = ()

# Распаковка
a, b, c = my_tuple
x, *rest = (1, 2, 3, 4)  # x=1, rest=(2,3,4)

# Неизменяемость
my_tuple[0] = 'new'  # TypeError!

# Применение в функциях
def get_stats(data):
    return min(data), max(data), sum(data) / len(data)

min_val, max_val, mean = get_stats([1, 2, 3, 4, 5])

# Tuple как ключ (hashable)
data_by_date = {(2024, 3, 29): [1, 2, 3], (2024, 3, 28): [4, 5, 6]}

# Использование в namedtuple
from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(x=10, y=20)
print(p.x, p.y)  # Более читаемо, чем tuple

Применение в Data Science:

from sklearn.metrics import precision_recall_fscore_support

# Функция возвращает tuple
precision, recall, f1, support = precision_recall_fscore_support(
    y_true, y_pred, average='weighted'
)

# Использование tuple как ключа
model_params = {
    ('rf', 10, 'gini'): 0.85,  # model_name, n_estimators, criterion
    ('rf', 10, 'entropy'): 0.83,
    ('gb', 100, None): 0.88
}

3. Set (Множество)

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

  • Неупорядоченная, изменяемая коллекция уникальных элементов
  • На основе хеш-таблицы (O(1) для проверки наличия)
  • Исключает дубликаты автоматически
  • Элементы должны быть hashable
# Создание
my_set = {1, 2, 3, 3, 2, 1}  # {1, 2, 3}
my_set = set([1, 2, 2, 3])  # {1, 2, 3}
empty_set = set()  # {} создаст dict!

# Операции
my_set.add(4)
my_set.discard(2)  # Удалить без ошибки
my_set.remove(1)  # Удалить с ошибкой если нет
my_set.pop()  # Удалить случайный элемент

# Проверка наличия - O(1)
if 3 in my_set:
    print("Есть")

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

intersection = set1 & set2  # {3}
union = set1 | set2  # {1, 2, 3, 4, 5}
difference = set1 - set2  # {1, 2}
sym_diff = set1 ^ set2  # {1, 2, 4, 5}

# Подмножество/надмножество
set1.issubset(set2)  # False
set1.issuperset(set2)  # False

Практические применения:

# Удаление дубликатов из списка
data = [1, 2, 2, 3, 3, 3, 4]
unique_data = list(set(data))  # [1, 2, 3, 4]

# Поиск уникальных ID
user_ids_in_log = {record['user_id'] for record in logs}  # Set comprehension
user_ids_in_db = {user.id for user in database.users}

# Находим ID только в логе
only_in_log = user_ids_in_log - user_ids_in_db

# Проверка наличия элемента быстро
allowed_features = {'age', 'income', 'credit_score', 'employment'}

if feature_name in allowed_features:  # O(1) вместо O(n)
    process_feature(feature_name)

4. Dictionary (Словарь)

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

  • Неупорядоченная (Python 3.7+: сохраняет порядок вставки) коллекция пар ключ-значение
  • Ключи должны быть hashable и уникальны
  • Значения могут быть любого типа
  • O(1) для поиска по ключу
# Создание
my_dict = {'name': 'John', 'age': 30}
my_dict = dict(name='John', age=30)
my_dict = {x: x**2 for x in range(5)}  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# Доступ
my_dict['name']  # 'John'
my_dict.get('email', 'not_provided')  # Безопаснее

# Обновление
my_dict['city'] = 'Moscow'
my_dict.update({'country': 'Russia', 'age': 31})

# Удаление
del my_dict['age']
my_dict.pop('city')

# Итерация
for key in my_dict:  # По ключам
    print(key, my_dict[key])

for key, value in my_dict.items():  # По парам
    print(key, value)

for value in my_dict.values():  # По значениям
    print(value)

Применение в ML:

# Конфигурация моделей
model_config = {
    'learning_rate': 0.001,
    'batch_size': 32,
    'epochs': 100,
    'optimizer': 'adam',
    'regularization': 0.01
}

# Сохранение результатов экспериментов
experiments = {
    'exp_001': {'accuracy': 0.92, 'precision': 0.89, 'recall': 0.91},
    'exp_002': {'accuracy': 0.94, 'precision': 0.93, 'recall': 0.95}
}

# Быстрый lookup
allowed_models = {'xgboost', 'lightgbm', 'catboost'}
if model_name in allowed_models:
    train_model(model_name)

5. defaultdict, Counter, OrderedDict (из collections)

from collections import defaultdict, Counter, OrderedDict

# defaultdict - автоматически создает значение для новых ключей
from collections import defaultdict

data = defaultdict(list)
data['fruits'].append('apple')  # Не нужно проверять, есть ли ключ
data['fruits'].append('banana')

# Counter - подсчёт элементов
from collections import Counter

sentence = "hello world hello python"
words = sentence.split()
word_count = Counter(words)
print(word_count)  # Counter({'hello': 2, 'world': 1, 'python': 1})
print(word_count.most_common(2))  # [('hello', 2), ('world', 1)]

# Для ML: подсчет класс-лейблов
from collections import Counter
class_distribution = Counter(y_train)
print(f"Класс 0: {class_distribution[0]} примеров")
print(f"Класс 1: {class_distribution[1]} примеров")

# OrderedDict - гарантирует порядок (теперь dict тоже, но OrderedDict используется в старом коде)
from collections import OrderedDict
ordered = OrderedDict([('z', 1), ('a', 2), ('m', 3)])

6. Deque (из collections)

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

  • Double-ended queue (очередь с двумя концами)
  • O(1) добавление/удаление с обоих концов (в отличие от list)
  • Используется когда нужны операции push/pop с обеих сторон
from collections import deque

queue = deque()
queue.append(1)  # Добавить в конец
queue.appendleft(0)  # Добавить в начало
queue.pop()  # Удалить из конца
queue.popleft()  # Удалить из начала

# Применение: BFS алгоритм
from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    
    while queue:
        vertex = queue.popleft()
        if vertex in visited:
            continue
        visited.add(vertex)
        print(vertex)
        queue.extend(graph[vertex] - visited)

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

ТипУпорядоченностьИзменяемостьУникальностьПоискПамять
listДаДаНетO(n)Много
tupleДаНетНетO(n)Мало
setНетДаДаO(1)Среднее
dictДа (3.7+)Да(ключи)O(1)Много
frozensetНетНетДаO(1)Среднее

Лучшие практики для Data Science

# 1. Используй set для проверки наличия (не list)
allowed_columns = {'age', 'income', 'score'}  # set O(1)
for col in df.columns:
    if col in allowed_columns:  # Быстро!
        process(col)

# 2. Используй tuple для неизменяемых данных
model_hyperparams = (10, 'gini', 0.8)  # Не меняется

# 3. Используй list для динамических данных
results = []
for model in models:
    results.append(train_model(model))

# 4. Используй dict для конфигурации
config = {
    'model': 'xgboost',
    'params': {'depth': 5, 'lr': 0.01}
}

# 5. Используй defaultdict/Counter для группировки
from collections import Counter
target_distribution = Counter(y_train)
Какие знаешь контейнерные типы данных Python? | PrepBro