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

Какие бывают базовые структуры данных в Python?

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

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

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

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

Какие бывают базовые структуры данных в 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:

  1. List — универсальный массив
  2. Tuple — неизменяемый список
  3. Dict — ассоциативный массив
  4. Set — уникальные элементы
  5. String — текст
  6. Deque — очередь с обоими концами
  7. Counter — подсчет элементов
  8. DefaultDict — словарь со значениями по умолчанию

Мастерство работы с этими структурами — основа эффективного программирования на Python!