Комментарии (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)