Какие бывают базовые структуры данных в Python?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Какие бывают базовые структуры данных в Python?
Структуры данных — это организованные способы хранения и управления данными. Python имеет встроенные структуры, которые покрывают 95% задач разработки.
1. List (Список) — упорядоченная коллекция
Массив с переменной длиной, хранит разнородные элементы, изменяемая (mutable).
# Создание
fruits = ['apple', 'banana', 'cherry']
numbers = [1, 2, 3, 4, 5]
mixed = [1, 'hello', 3.14, True, None]
# Доступ по индексу (0-based)
print(fruits[0]) # apple
print(fruits[-1]) # cherry (последний элемент)
# Слайсинг (срезы)
print(fruits[0:2]) # ['apple', 'banana']
print(numbers[::2]) # [1, 3, 5] (каждый второй)
# Методы
fruits.append('date') # Добавить в конец
fruits.insert(1, 'blueberry') # Вставить на позицию
fruits.remove('banana') # Удалить элемент
fruits.pop() # Удалить последний (вернуть)
# Итерация
for fruit in fruits:
print(fruit)
# Список понимания (list comprehension)
squares = [x**2 for x in range(1, 6)] # [1, 4, 9, 16, 25]
even = [x for x in numbers if x % 2 == 0] # [2, 4]
Сложность операций:
- Доступ по индексу: O(1)
- Поиск: O(n)
- Вставка/удаление (начало): O(n)
- Вставка/удаление (конец): O(1)
2. Tuple (Кортеж) — неизменяемый список
Как список, но неизменяемая (immutable). Может быть ключом словаря.
# Создание
point = (10, 20)
rgb = (255, 0, 128)
empty = ()
single = (42,) # Запятая важна!
# Доступ
print(point[0]) # 10
print(point[-1]) # 20
# Неизменяемость
# point[0] = 5 # ❌ TypeError: 'tuple' object does not support item assignment
# Распаковка
x, y = point
print(x, y) # 10 20
# Возврат множества значений из функции
def get_coordinates():
return (10, 20) # Возвращаем tuple
# Используем как ключ словаря
locations = {(0, 0): 'origin', (1, 1): 'diagonal'}
print(locations[(0, 0)]) # origin
Когда использовать:
- Когда данные не должны меняться
- Как ключи словарей
- Возвращаемые значения функций
- В словарях для координат, цветов и т.д.
3. Dictionary (Словарь) — хеш-таблица
Пары ключ-значение, быстрый поиск, изменяемая.
# Создание
user = {
'name': 'John',
'age': 30,
'email': 'john@example.com'
}
scores = {1: 'low', 2: 'medium', 3: 'high'}
# Доступ
print(user['name']) # John
print(user.get('age')) # 30
print(user.get('city', 'Unknown')) # Unknown (значение по умолчанию)
# Добавление/изменение
user['age'] = 31
user['city'] = 'NYC'
# Удаление
del user['city']
user.pop('age') # Удалить и вернуть значение
# Итерация
for key in user:
print(f"{key}: {user[key]}")
for key, value in user.items():
print(f"{key}: {value}")
# Понимание словарей
squares = {x: x**2 for x in range(1, 6)} # {1: 1, 2: 4, 3: 9, ...}
Сложность операций:
- Поиск: O(1) в среднем
- Вставка: O(1) в среднем
- Удаление: O(1) в среднем
Ключи должны быть хешируемы:
# ✅ Правильные ключи
data = {
'string': 1,
42: 2,
(1, 2): 3, # Кортеж
frozenset([1, 2]): 4
}
# ❌ Неправильные ключи
# data = {[1, 2]: 'value'} # TypeError: list is unhashable
# data = {{}: 'value'} # TypeError: dict is unhashable
4. Set (Множество) — уникальные элементы
Неупорядоченная коллекция уникальных элементов.
# Создание
colors = {'red', 'green', 'blue'}
numbers = {1, 2, 2, 3, 3, 3} # {1, 2, 3} — дубликаты удалены
empty_set = set() # Пустое множество
# Проверка принадлежности
print('red' in colors) # True
print('yellow' in colors) # False
# Добавление/удаление
colors.add('yellow')
colors.remove('red') # Ошибка если нет
colors.discard('red') # Тихо, если нет
# Операции с множествами
set_a = {1, 2, 3}
set_b = {2, 3, 4}
union = set_a | set_b # {1, 2, 3, 4} — объединение
intersection = set_a & set_b # {2, 3} — пересечение
difference = set_a - set_b # {1} — разница
sym_diff = set_a ^ set_b # {1, 4} — симметричная разница
# Подмножество
print({1, 2} <= set_a) # True
print({1, 5} <= set_a) # False
Когда использовать:
- Удаление дубликатов:
unique = set(list) - Проверка принадлежности: O(1) вместо O(n) для list
- Операции множеств: пересечение, объединение
5. String (Строка) — текст
Неизменяемая последовательность символов.
# Создание
text = "Hello, World!"
empty = ""
with_quotes = 'I\'m happy'
multiline = """Line 1
Line 2
Line 3"""
# Доступ
print(text[0]) # H
print(text[-1]) # !
print(text[0:5]) # Hello
# Методы
print(text.lower()) # hello, world!
print(text.upper()) # HELLO, WORLD!
print(text.split(', ')) # ['Hello', 'World!']
print(' '.join(['a', 'b'])) # a b
print(text.replace('World', 'Python')) # Hello, Python!
print('Wor' in text) # True
# F-strings (форматирование)
name = "Alice"
age = 30
print(f"Name: {name}, Age: {age}") # Name: Alice, Age: 30
6. Deque (Double-Ended Queue) — очередь с обоими концами
from collections import deque
q = deque([1, 2, 3])
# Операции на обоих концах O(1)
q.append(4) # Добавить справа: [1, 2, 3, 4]
q.appendleft(0) # Добавить слева: [0, 1, 2, 3, 4]
q.pop() # Удалить справа: [0, 1, 2, 3]
q.popleft() # Удалить слева: [1, 2, 3]
7. Counter — подсчет элементов
from collections import Counter
text = "mississippi"
count = Counter(text)
print(count) # Counter({'i': 4, 's': 4, 'm': 1, 'p': 2})
print(count['i']) # 4
print(count.most_common(2)) # [('i', 4), ('s', 4)]
8. DefaultDict — словарь со значением по умолчанию
from collections import defaultdict
# ❌ Без defaultdict
regular_dict = {}
if 'age' not in regular_dict:
regular_dict['age'] = []
regular_dict['age'].append(30)
# ✅ С defaultdict
default_dict = defaultdict(list)
default_dict['age'].append(30) # Автоматически создает list
print(default_dict) # defaultdict(<class 'list'>, {'age': [30]})
Сравнение структур
Структура | Упорядочен | Изменяемая | Уникальность | Доступ | Ключ
-----------|------------|-----------|--------------|--------|-------
List | Да | Да | Нет | индекс | -
Tuple | Да | Нет | Нет | индекс | Да
Dict | Да* (3.7+) | Да | Нет (значения)| ключ | Да
Set | Нет | Да | Да | - | -
String | Да | Нет | Нет | индекс | -
Практические примеры
Пример 1: Подсчет частоты букв
from collections import Counter
text = "hello world"
frequency = Counter(text)
print(frequency.most_common()) # [('l', 3), ('o', 2), ...]
Пример 2: Группировка по ключам
from collections import defaultdict
students = [
{'name': 'Alice', 'grade': 'A'},
{'name': 'Bob', 'grade': 'B'},
{'name': 'Charlie', 'grade': 'A'},
]
by_grade = defaultdict(list)
for student in students:
by_grade[student['grade']].append(student['name'])
print(by_grade) # {'A': ['Alice', 'Charlie'], 'B': ['Bob']}
Пример 3: Кэш с максимальным размером
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity: int):
self.cache = OrderedDict()
self.capacity = capacity
def put(self, key: int, value: int) -> None:
if key in self.cache:
self.cache.move_to_end(key)
self.cache[key] = value
if len(self.cache) > self.capacity:
self.cache.popitem(last=False)
Выбор структуры для задачи
# Нужен упорядоченный список с быстрым доступом
data = [1, 2, 3, 4, 5] # → List
# Координаты или ключ словаря
point = (10, 20) # → Tuple
# Быстрый поиск и хранение пар
user_data = {'name': 'John', 'age': 30} # → Dict
# Уникальные элементы
unique_ids = {1, 2, 3} # → Set
# Текст
greeting = "Hello" # → String
# Быстрые операции с обоих концов
queue = deque([1, 2, 3]) # → Deque
# Подсчет элементов
word_count = Counter(words) # → Counter
Заключение
Основные структуры данных Python:
- List — универсальный массив
- Tuple — неизменяемый список
- Dict — ассоциативный массив
- Set — уникальные элементы
- String — текст
- Deque — очередь с обоими концами
- Counter — подсчет элементов
- DefaultDict — словарь со значениями по умолчанию
Мастерство работы с этими структурами — основа эффективного программирования на Python!