🐍🧩 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()))))