# Структуры данных

### **Основные структуры данных в Python**

#### 1. **list** — список

* **Мутируемый** (можно изменять элементы).
* Упорядоченный.
* Можно хранить разные типы данных.
* Часто используется для хранения наборов тестовых данных, ответов API, элементов DOM и т. д.

```python
tests = ["login", "payment", "logout"]
tests.append("profile")
```

***

#### 2. **tuple** — кортеж

* **Иммутабельный** (нельзя изменять после создания).
* Упорядоченный.
* Быстрее списка, подходит для константных наборов данных.
* В тестах: часто используется как ключ в словарях или для фиксированных данных.

```python
coords = (10, 20)
```

***

#### 3. **set** — множество

* **Мутируемое**.
* Неупорядоченное.
* Уникальные элементы.
* Быстрые операции поиска и удаления.
* В тестах: удобно сравнивать, что два набора данных совпадают (без учёта порядка).

```python
tags = {"smoke", "regression", "api"}
```

***

#### 4. **frozenset** — неизменяемое множество

* То же, что `set`, но **иммутабельное**.
* Можно использовать как ключ словаря.

```python
immutable_tags = frozenset(["smoke", "api"])
```

***

#### 5. **dict** — словарь

* **Мутируемый**.
* Пары ключ-значение.
* В тестах: хранение конфигураций, JSON-ответов, маппингов.

```python
config = {"url": "https://test.com", "timeout": 30}
```

***

#### 6. **str** — строка

* **Иммутабельная**.
* Последовательность символов.
* В тестах часто обрабатывается при парсинге логов, ответов API, HTML.

```python
message = "Test passed"
```

***

### **Дополнительно из модуля `collections`**

(очень часто спрашивают на Senior-позиции)

* `namedtuple` — кортеж с именованными полями.
* `deque` — двусторонняя очередь (эффективная вставка/удаление с обоих концов).
* `Counter` — подсчёт элементов.
* `defaultdict` — словарь с автоматическим созданием значений по умолчанию.
* `OrderedDict` — словарь с сохранением порядка (в Python 3.7+ `dict` уже упорядочен).

***

### **Важные моменты для собеседования**

* **Мутируемые vs иммутабельные**: список и словарь можно менять, кортеж и строку — нет.
* **Время доступа**: `dict` и `set` работают за O(1) в среднем.
* **Когда использовать**:
  * `list` — когда нужен порядок и дубликаты.
  * `set` — когда нужны уникальные элементы.
  * `dict` — когда нужен доступ по ключу.
  * `tuple` — когда данные не должны меняться.
