# Множества и их методы

### **1. Что такое множества**

* **Множество (`set`)** — это **неупорядоченная коллекция уникальных элементов**.
* **frozenset** — неизменяемое множество.
* Элементы множества **должны быть хешируемыми** (числа, строки, кортежи).

```python
s = {1, 2, 3, 3}  # дубликаты удаляются автоматически
print(s)  # {1, 2, 3}

fs = frozenset([1, 2, 3])
```

***

### **2. Основные методы множеств**

| Метод / Операция                 | Описание                                                              |
| -------------------------------- | --------------------------------------------------------------------- |
| `add(elem)`                      | Добавляет элемент в set                                               |
| `remove(elem)`                   | Удаляет элемент, если нет — `KeyError`                                |
| `discard(elem)`                  | Удаляет элемент, если есть, иначе ничего не делает                    |
| `pop()`                          | Удаляет и возвращает случайный элемент                                |
| `clear()`                        | Очищает множество                                                     |
| `copy()`                         | Возвращает поверхностную копию                                        |
| `union()` или \|                 | \|                                                                    |
| `intersection()` или `&`         | Пересечение множеств                                                  |
| `difference()` или `-`           | Разность множеств                                                     |
| `symmetric_difference()` или `^` | Симметричная разность (элементы, которые есть в одном, но не в обоих) |
| `issubset()`                     | Проверка, является ли множество подмножеством другого                 |
| `issuperset()`                   | Проверка, является ли множество надмножеством другого                 |

***

### **3. Примеры использования**

```python
a = {1, 2, 3}
b = {3, 4, 5}

# Добавление
a.add(10)

# Удаление
a.discard(2)
# a.remove(100)  # KeyError, если элемента нет

# Операции над множествами
print(a | b)  # {1, 3, 4, 5, 10}  - объединение
print(a & b)  # {3}              - пересечение
print(a - b)  # {1, 10}          - разность
print(a ^ b)  # {1, 4, 5, 10}    - симметричная разность

# Проверка подмножества
print({1,3}.issubset(a))  # True
```

***

### **4. Применение в автотестах**

* **Проверка уникальности элементов**

```python
ids = [1, 2, 3, 3, 4]
assert len(ids) != len(set(ids))  # есть дубликаты
```

* **Сравнение множеств данных из API**

```python
expected_fields = {"id", "name", "email"}
response_fields = set(response.json().keys())
assert expected_fields.issubset(response_fields)
```

* **Фильтрация и пересечение данных**

```python
actual_users = {"Alice", "Bob", "Carol"}
active_users = {"Bob", "Carol"}
assert actual_users & active_users == {"Bob", "Carol"}
```

***

💡 **Вывод:**

* `set` = изменяемое множество уникальных элементов.
* `frozenset` = неизменяемое множество.
* Методы множества удобны для **объединения, пересечения, проверки уникальности и сравнения данных**, что очень полезно в автотестах.
