• 1
    Ввод и вывод данных
    • Задачи
  • 2
    Условия
    • Задачи
  • 3
    Цикл for
    • Задачи
  • 4
    Строки
    • Задачи
  • 5
    Цикл while
    • Задачи
  • 6
    Списки
    • Задачи
  • 7
    Двумерные массивы
    • Задачи
  • 8
    Словари
    • Задачи
  • 9
    Множества
    • Задачи
  • 10
    Функции и рекурсия
    • Задачи
  • к

Занятие 9. Множества

Уровень сложности:

иконка человека красный иконка человека белая иконка человека зеленая Pythonlib

Задача«Анализ базы»

Фитнес-центр хочет проанализировать свою клиентскую базу, чтобы выявить клиентов, соответствующих определенным критериям для таргетированной рекламы. У вас есть данные о клиентах, представленные в виде набора характеристик. Необходимо разработать программу, которая позволяет находить клиентов, удовлетворяющих нескольким заданным условиям одновременно.

Формат ввода

На первой строке вводится число N - общее количество клиентов.
Далее, для каждого клиента (всего N строк) вводится информация о нем в следующем формате: id возраст пол наличие_абонемента интерес1 интерес2 ... интересK.
id - уникальный идентификатор клиента (целое число).
возраст - возраст клиента (целое число).
пол - пол клиента ('M' для мужского, 'F' для женского).
наличие_абонемента - наличие абонемента ('Y' для да, 'N' для нет).
интерес1 интерес2 ... интересK - список интересов клиента (строки, разделенные пробелами). Количество интересов может быть различным для каждого клиента.
После данных о клиентах вводится число M - количество критериев поиска.
Далее, для каждого критерия (всего M строк) вводится строка критерия в формате тип значение.
тип - тип критерия (одно из: возрастполабонементинтерес).
значение - значение критерия. Для типа возраст - целое число, для типа пол - 'M' или 'F', для типа абонемент - 'Y' или 'N', для типа интерес - строка

Формат Вывода

Вывести список идентификаторов клиентов, удовлетворяющих всем заданным критериям, в отсортированном порядке, разделенных пробелами. Если ни один клиент не соответствует критериям, вывести "None"

Пример

Ввод

5
1 25 M Y плавание фитнес
2 30 F N йога пилатес
3 25 F Y танцы йога
4 40 M Y фитнес бокс
5 30 M N плавание бокс
3
возраст 25
пол F
интерес йога

Вывод

3

Подсказка

Сравнение множеств

Подмножество (Subset)

Множество A является подмножеством множества B, если все без исключения элементы множества A содержатся также и в множестве B. Для проверки этого условия используются метод issubset() и оператор <=.

Полезный совет: Оператор <= проверяет на "нестрогое" подмножество. Это означает, что любое множество является подмножеством самого себя (set1 <= set1 вернет True). Если вам нужно проверить, что множество A является подмножеством B, но при этом не равно ему, используйте оператор строгого неравенства <.

set1 = {1, 2}
set2 = {1, 2, 3}
set3 = {1, 2}

# Проверка на подмножество
print(set1.issubset(set2))  # Вывод: True
print(set1 <= set2)         # Вывод: True

# Проверка на строгое подмножество
print(set1 < set2)          # Вывод: True
print(set3 < set1)          # Вывод: False, так как множества равны

Надмножество (Superset)

Множество A является надмножеством множества B, если оно содержит все элементы, которые есть в множестве B. Для проверки используются метод issuperset() и оператор >=.

Полезный совет: Аналогично подмножествам, оператор >= проверяет на "нестрогое" надмножество. Для проверки на строгое надмножество (A содержит все элементы B и хотя бы один дополнительный) используйте оператор >.

set1 = {1, 2, 3}
set2 = {1, 2}

# Проверка на надмножество
print(set1.issuperset(set2))  # Вывод: True
print(set1 >= set2)          # Вывод: True

# Проверка на строгое надмножество
print(set1 > set2)           # Вывод: True
print(set1 > {1, 2, 3})      # Вывод: False, так как множества равны

Равенство множеств

Множества считаются равными, если они содержат абсолютно одинаковый набор элементов. Порядок элементов при этом не имеет никакого значения. Для проверки используется оператор ==.

set1 = {1, 2, 3}
set2 = {3, 2, 1}
set3 = {1, 2, 3, 3} # Дубликат будет проигнорирован при создании множества

print(set1 == set2)   # Вывод: True
print(set1 == set3)   # Вывод: True

Другие методы множеств

Копирование множества

Метод copy() возвращает поверхностную копию множества.

Важный совет: Не путайте копирование с присваиванием. Если вы напишете set2 = set1, то set2 будет не новым множеством, а лишь другой ссылкой на set1. Изменение set2 приведет к изменению set1. Используйте copy(), чтобы создать независимое множество.

set1 = {1, 2, 3}

# Правильное копирование
set2 = set1.copy()
set2.add(4)
print(f"Оригинал set1: {set1}")  # Вывод: Оригинал set1: {1, 2, 3}
print(f"Копия set2: {set2}")    # Вывод: Копия set2: {1, 2, 3, 4}

# Неправильное копирование (присваивание ссылки)
set3 = set1
set3.add(5)
print(f"Оригинал set1 после изменения set3: {set1}") # Вывод: Оригинал set1 после изменения set3: {1, 2, 3, 5}
print(f"Ссылка set3: {set3}")                       # Вывод: Ссылка set3: {1, 2, 3, 5}

Обновление множества

Метод update() добавляет в текущее множество все элементы из другого множества или любого другого итерируемого объекта (например, списка или кортежа). Метод изменяет исходное множество и ничего не возвращает (None).

set1 = {1, 2, 3}
set2 = {3, 4, 5}
list1 = [5, 6, 7]

set1.update(set2)  # Дубликат {3} будет проигнорирован
print(set1)        # Вывод: {1, 2, 3, 4, 5}

set1.update(list1) # Можно обновлять из списка
print(set1)        # Вывод: {1, 2, 3, 4, 5, 6, 7}

Множества и их применения

Множества чрезвычайно полезны в различных задачах благодаря своей скорости и уникальным свойствам. Они идеально подходят для удаления дубликатов, быстрой проверки на наличие элемента и выполнения математических операций (объединение, пересечение, разность).

Удаление дубликатов из списка

Это одно из самых частых применений множеств. Преобразование списка в множество автоматически удаляет все дубликаты. Затем, при необходимости, множество можно снова преобразовать в список.

Важно помнить: При таком преобразовании исходный порядок элементов списка не сохраняется.

numbers = [1, 2, 2, 3, 4, 4, 5, 1]
unique_numbers = list(set(numbers))
print(unique_numbers)  # Вывод может быть [1, 2, 3, 4, 5] (порядок не гарантирован)

Поиск общих элементов в двух списках

Чтобы найти элементы, которые присутствуют в обеих коллекциях, можно преобразовать их в множества и использовать оператор пересечения &.

list1 = [1, 2, 3, 4]
list2 = [3, 4, 5, 6]
common_elements = list(set(list1) & set(list2))
print(common_elements)  # Вывод: [3, 4] (порядок не гарантирован)

Поиск уникальных элементов (симметричная разность)

Чтобы найти элементы, которые есть в одном из списков, но не в обоих сразу, используется оператор симметричной разности ^.

list1 = [1, 2, 3, 4]
list2 = [3, 4, 5, 6]
unique_to_each_list = list(set(list1) ^ set(list2))
print(unique_to_each_list)  # Вывод: [1, 2, 5, 6] (порядок не гарантирован)
main.py
Тест 1
Тест 2
Тест 3
Тест 4
Тест 5
Тест 6
Тест 7
Тест 8
Тест 9
Тест 10
Решение разработчика

🎉 Поздравляем! 🎉

Ты отлично справился с задачей! Это был непростой вызов, но ты нашёл правильное решение. Ты на шаг ближе к мастерству в программировании! Продолжай в том же духе, ведь каждый пройденный этап делает тебя ещё сильнее.

AD

Реклама

red-snake blue-snake green-snake

Запускаем ваш код...

Помощник ИИ

Привет! Я твой помощник по программированию. Задавай любые вопросы по Python, я могу рассказать о функциях, методах, обьяснить то, что тебе не понятно, а так же о текущей задаче!