Вопрос по множествам в Python
Задача:
Формат входных данных На вход программе в первой строке дается число mm – количество уроков, проведенных с начала учебного года. Далее идёт mm блоков строк, описывающих листки с фамилиями. На первой строке каждого блока указано количество фамилий n_in i , затем идёт n_in i строчек с фамилиями тех, кто был на ii-ом уроке.
Формат выходных данных Программа должна вывести фамилии учеников, которые были на всех уроках, отсортированных в лексикографическом порядке. Каждая фамилия должна быть записана на отдельной строке.
Что я написал:
m = int(input())
myset = {input() for _ in range(int(input()))}
myset1 = set()
myset = sorted(myset)
if m==1:
print(*myset, sep='\n')
else:
for i in range(m-1):
for j in range(int(input())):
myset1.add(input())
myset.intersection_update(myset1)
myset1.clear()
myset = sorted(myset)
for row in myset1:
print(myset1)
Ошибка:
Traceback (most recent call last): File "/sandbox/main.py", line 11, in myset.intersection_update(myset1) AttributeError: 'list' object has no attribute 'intersection_update'
Не понимаю почему список, если я указываю как множество?
Пример вводных данных:
3
3
Князев
Сафонов
Майоров
2
Князев
Майоров
1
Майоров
Ответы (2 шт):
Функция sorted(), указанная Вами в строке 4, будет возвращать список, а не множество. Разумеется, для списка функция intersection_update() не определена, а только для множества.
Для решения проблемы достаточно записать set(lst), где lst — Ваш отсортированный (или нет) список. Вдобавок отмечу, что на строке 13 присутствует точно такая же ошибка: множество обратится в список.
К тому же, говоря об остальном коде: при выводе строк из множества-пересечения Вы берёте уже опустошённый ранее буфер myset1 вместо myset. Плюс ещё непонятно, зачем выводить сами множества, если Вы хотите отдельные значения оттуда брать (но это уже на Ваше усмотрение).
m = int(input())
myset = {input() for _ in range(int(input()))}
myset1 = set()
myset = set(sorted(myset)) # <--
if m==1:
print(*myset, sep='\n')
else:
for i in range(m-1):
for j in range(int(input())):
myset1.add(input())
myset.intersection_update(myset1)
myset1.clear()
myset = set(sorted(myset)) # <--
for row in myset: # myset1 -> myset
print(row) # myset -> row
Функция sorted() возвращает список каждый раз, несмотря на то, какой тип был передан.