🐍🧩 5 задач по Python для новичков с решениями
Задачи о примерных студентах, сортировке IP-адресов, гематрии слов, группировке дубликатов и разделении списка на отрезки.
1. Список примерных студентов
Декану факультета захотелось узнать, какие студенты посетили все лекции с начала учебного года. Для каждой лекции есть список присутствовавших студентов. Напишите программу, определяющую фамилии студентов, которые не пропустили ни одной лекции.
Входные данные:
В первой строке подается число m – количество лекций, проведенных с начала учебного года. Далее идут m блоков строк со списками студентов. На первой строке каждого блока указано количество фамилий n, а затем идут n строк с фамилиями тех, кто был на лекции.
#Пример ввода 3 3 Иванов Петрова Сидорова 4 Иванов Петрова Михайлова Колесников 3 Петрова Иванов Колесников
Выходные данные:
Программа должна вывести список студентов, посетивших все лекции, в алфавитном порядке.
#Пример вывода Иванов Петрова
Способ 1:
n = int(input()) res = {input() for _ in range(int(input()))} for _ in range(n - 1): res &= {input() for _ in range(int(input()))} print(*sorted(res), sep='\n')
Способ 2:
res = [set(input() for _ in range(int(input()))) for _ in range(int(input()))] print(*sorted(set.intersection(*res)), sep='\n')
Способ 3:
n = int(input()) my_set = {frozenset(input() for _ in range(int(input()))) for _ in range(n)} res = frozenset.intersection(*my_set) print(*sorted(res), sep='\n')
2. Сортировка IP-адресов
Напишите программу, которая считывает IP-адреса и выводит их в порядке возрастания в соответствии с десятичным представлением. Чтобы перевести адрес, к примеру 192.168.1.2 в десятичное число, применяют формулу:
192 х 2563 + 168 x 2562 + 1 x 2561 + 2 x 2560 = 3232235778
Входные данные:
В первой строке подается число n, затем n строк с IP-адресами.
#Пример ввода 12 123.199.44.25 123.199.201.245 145.198.168.93 170.67.181.62 170.67.222.111 170.67.11.90 45.8.106.59 203.13.32.156 179.67.171.194 179.67.181.62 179.67.212.111 177.67.10.90
Выходные данные:
Список IP-адресов, отсортированных по десятичному представлению.
#Пример вывода 45.8.106.59 123.199.44.25 123.199.201.245 145.198.168.93 170.67.11.90 170.67.181.62 170.67.222.111 177.67.10.90 179.67.171.194 179.67.181.62 179.67.212.111 203.13.32.156
Решение
Способ 1 – с использованием ipaddress:
import ipaddress n = int(input()) spisok = [] for i in range(n): temp = input() spisok.append(temp) sortedkey = sorted(spisok, key = ipaddress.IPv4Address) print(*sortedkey, sep='\n')
Способ 2:
print(*sorted([input() for _ in range(int(input()))], key=lambda x: [*map(int, x.split('.'))]), sep='\n')
Способ 3:
def decFormat(ip): return sum(map(lambda x, y: int(x) * 256 ** y, ip.split('.'), (3, 2, 1, 0))) ips = [input() for _ in range(int(input()))] print(*sorted(ips, key = decFormat), sep = '\n')
3. Сортировка по гематрии
Гематрия – это сумма числовых значений букв, входящих в состав слова. В данном случае числовое значение букв определяется по таблице ASCII, причем учитываются только заглавные буквы (то есть при подсчете гематрии все буквы переводятся в верхний регистр). Программа должна вывести список слов в исходном регистре, отсортированный в соответствии с гематрией.
Входные данные:
Число n, затем n строк с английскими словами, состоящими из букв в разных регистрах.
#Пример ввода 5 cAndy WAffle chocolaTE Cake tirAMIsu
Выходные данные:
Список, отсортированный в соответствии с гематрией слов.
#Пример вывода Cake cAndy WAffle chocolaTE tirAMIsu
Решение
Способ 1:
def gemValue(word): return sum(map(lambda l: ord(l.upper()) - ord('A'), word)), word words = [input() for _ in range(int(input()))] print(*sorted(words, key=gemValue), sep='\n')
Способ 2:
words = [input() for _ in range(int(input()))] print(*sorted(sorted(words), key=lambda word: sum([ord(sym.upper()) - ord('A') for l in word])), sep='\n')
Способ 3:
print(*sorted([input() for _ in range(int(input()))], key=lambda x: (sum([ord(_) - ord('A') for _ in x.upper()]), x)), sep='\n')
4. Группировка дубликатов
На вход подается строка символов, разделенных пробелами. Напишите программу, которая группирует одинаковые символы, формируя вложенный список.
Входные данные:
#Пример ввода h h h e e l l l o w w o o o o r r r l l d d
Выходные данные:
#Пример вывода [['h', 'h', 'h'], ['e', 'e'], ['l', 'l', 'l'], ['o'], ['w', 'w'], ['o', 'o', 'o', 'o'], ['r', 'r', 'r'], ['l', 'l'], ['d', 'd']]
Решение
Вариант 1 – с itertools:
from itertools import groupby print([list(group) for key, group in groupby(input().split())])
Вариант 2:
res = [] for i in input().split(): res.append([i]) if not res or i not in res[-1] else res[-1].append(i) print(res)
Вариант 3:
res = [] for i in input().split(): if (not res) or (i != res[-1][-1]): res.append([i]) else: res[-1].append(i) print(res)
5. Разделение списка на отрезки
На вход подается строка символов, из которых формируется список и число n. Напишите функцию, которая разбивает список на n частей, формируя вложенный список.
Входные данные:
#Пример ввода w t z k p e h t b 3
Выходные данные:
#Пример вывода [['w', 't', 'z'], ['k', 'p', 'e'], ['h', 't', 'b']]
Решение
Способ 1:
def cutList(n): cuts = [lst[x:x+n] for x in range(0, len(lst), n)] return cuts lst = input().split() n = int(input()) print(cutList(n))
Способ 2:
def cutList(lst: list, n: int) -> list: return [lst[i:n + i] for i in range(0, len(lst), n)] print(cutList(input().split(), int(input())))
Способ 3:
def cutList(lst, n): for i in range(0, len(lst), n): yield lst[i:i + n] print(list(cutList(input().split(), int(input()))))