python 2023 a 5 Сортировка данных
Введение.
Всем привет! Я тут подумала хорошо будет поделиться своими решениями по питону! Пожалуйста подпишитесь на мой канал про мою жизнь в МГУ "Варечка Окаянная")))
1. Две команды
Для игры в американский футбол собрались 22 мальчика с разным весом. Их вес (у всех он разный) и их имена (тоже у всех разные) даны в текстовом файле. Требуется создать две команды следующим образом: отсортировать всех ребят по убыванию веса, а затем 1-го, 3-го, 5-го и т.д. игроков отобрать в 1-ю команду, а оставшихся — во 2-ю команду. Вывести список команды №1 в первые 11 строк файла team.txt, а список команды №2 в последние 11 строк файла team.txt. В списках команд указывать и имена, и значения веса.
Формат ввода
Текстовый файл weights.txt содержит в каждой строке пары ИМЯ ВЕС (через пробел). Например, John 57. Вес может быть вещественным числом.
Формат вывода
Файл team.txt, содержащий строки исходного файла, отсортированные в том порядке, который требуется в данном задании.
Примечания
Для сортировки можно использовать sorted() с указанием параметров (см. лекцию). Для сортировки по убыванию веса можно указать в качестве параметра sorted() значение reverse=True. В задаче не разрешается использовать библиотеку NumPy.
Ответ:
with open('weights.txt', 'r') as file:
lines = file.readlines()
players = []
for line in lines:
name, weight = line.strip().split()
players.append((name, float(weight)))
players.sort(key=lambda x: x[1], reverse=True)
team1 = [player for i, player in enumerate(players) if i % 2 == 0]
team2 = [player for i, player in enumerate(players) if i % 2 != 0]
with open('team.txt', 'w') as file:
for player in team1:
file.write(f'{player[0]} {player[1]}\n')
for player in team2:
file.write(f'{player[0]} {player[1]}\n')
2. Неопубликованный шедевр
Журналист обнаружил в архиве ранее не публиковавшуюся шифровку Эдгара Алана По poe_unpublished.txt. Чтобы не просто представить её публике, а совершить сенсацию, он хочет расшифровать её и для этого нанял вас. Вы разобрались, что в тексте намеренно перепутаны строки, а в каждой строке перепутаны слова. Для применения алгоритма расшифрования нужно упорядочить строки по возрастанию количества слов в каждой строке (слова разделяются пробелами), а внутри каждой строки слова нужно упорядочить по количеству букв в них. Результат нужно сохранить в файл poe_decode_attempt.txt
Формат ввода
Список зашифрованных строк, записанных в файле poe_unpublished.txt
Формат вывода
Список расшифрованных строк, записанных в файл poe_decode_attempt.txt
Примечания
В конце выводимых строк не нужны лишние пробелы! Обратите внимание, что строки по умолчанию сортируются в лексикографическом порядке, по условию же их нужно сортировать по количеству слов. При считывании данных через readlines() вместе с каждой строкой сохраняется завершающий её символ \n. Это нужно не забывать и учитывать при вычислении длины слов (символ \n учитываться не должен).
Ответ:
with open('poe_unpublished.txt', 'r') as file:
lines = file.readlines()
lines = [line.strip().split() for line in lines]
lines = [sorted(line, key=lambda word: len(word)) for line in lines]
lines.sort(key=lambda line: len(line))
with open('poe_decode_attempt.txt', 'w') as file:
for line in lines:
file.write(' '.join(line) + '\n')
3. Транспонирование
Биолог провёл исследование устойчивости нескольких видов бактерий стрептококка к нескольким антибиотикам и получил численные оценки, характеризующие эффективность действия каждого препарата. Его данные хранятся в формате текстовой таблицы дробных чисел (с плавающей точкой) med_research.txt, при этом по горизонтали изменяются виды бактерий, а по вертикали — виды антибиотиков. Однако для отчёта требуется, чтобы виды антибиотиков шли по горизонтали, а виды бактерий — по вертикали. Биолог узнал, что эта операция называется в математике транспонированием, но он не знает, как её сделать автоматически. Если вы не поможете, то ему предстоит провести ночь, вручную переставляя числа в огромном листе. В файле хранятся только сами числа. Список видов бактерий и список антибиотиков вас не интересуют, биолог вставит их сам.
Формат ввода
Ввод из файла med_research.txt, все значения в строках разделены пробелом. Количество строк в исходной матрице >= 2, количество столбцов в исходной матрице >= 2.
Формат вывода
Вывод в файл output.txt.
Ответ:
with open('med_research.txt', 'r') as file:
lines = file.readlines()
matrix = [line.strip().split() for line in lines]
transposed_matrix = []
for col in range(len(matrix[0])):
row = []
for row_data in matrix:
row.append(row_data[col])
transposed_matrix.append(row)
with open('output.txt', 'w') as file:
for row in transposed_matrix:
file.write(' '.join(row) + '\n')
4. Логирование звонков
Руководитель хочет узнать, какой из двух его заместителей A или B больше времени тратит на звонки по телефону. Для этого он установил шпионское ПО на их смартфоны и получил файл the_calls.txt, в котором для каждого звонка по телефону указано: дата в формате YYYY.MM.DD, длительность звонка в секундах (целое число), буква A или B, а также номер телефона, на который был совершён звонок (без пробелов, но со значком + и скобками). Поля в строке разделяются знаком табуляции. Руководителю более подозрительны звонки, длившиеся дольше всего, поэтому строки следует отсортировать в обратном порядке по длительности звонка (сначала самые длительные). Распределите строки из файла на два упорядоченных указанным образом списка, и запишите их в файл calls.txt: Сначала группу звонков A, затем - группу звонков B.
Формат ввода
Строки, записанные в файл the_calls.txt в описанном в условии формате.
Формат вывода
Вывод в файл calls.txt
Примечания
Не забывайте, что в первоначальном виде длительность звонка - это строка. Поэтому к ключу сортировки нужно добавлять вызов метода int(). Во входном файле данные разделяются не пробелом, а знаком табуляции. Нужно делать str.split('\t'). Проверьте, что в выходном файле не нужна лишняя пустая строка в конце. Разрешается ввод и вывод только через файл (см. рекомендации к вводу-выводу). Обратите внимание, что в вашем коде названия входного и выходного файла должны совпадать с названиями, указанными в условии. Проверьте корректность перехода на новую строку после вывода всех номеров от A и перед выводом номеров от B. В частности, проверьте ситуацию, когда во входном файле на последней строке номер от B (и он не самый короткий) (без \n в конце). Обратите внимание, что в задании нужно выполнить стабильную сортировку (т.е. если у двух звонков одинаковой группы (A или B) длительности одинаковы, то раньше нужно вывести тот звонок, который был указан ранее в исходном файле. Большинство решений с использованием sort()/sorted приводят к стабильной сортировке. Но в случае ошибок в Яндекс. Контесте - рекомендуем проверить Вашу программу на данных с одинаковыми длительностями звонков.
Ответ:
the_calls_txt = '''
2021.12.12\t3\tB\t+79090329400
2019.10.03\t18\tA\t+79999995454
2020.05.04\t13\tB\t+72352452532
2020.05.04\t4\tA\t+79023987567
'''.split('\n')
with open('the_calls.txt', 'r') as f:
lines = f.read().splitlines()
a = sorted(lines, key=lambda x: ((s := x.split())[2], -int(s[1])))
with open('calls.txt', 'w', encoding='utf-8') as f:
f.write('\n'.join(a))
Спасибо!
Телеграмм Свалка астронома Ai 🦄 MSU
Телеграмм Варечкин Блокнот 🌸 MSU
ВК Школа https://vk.com/mgu_gdz Физиув UwU
Дзен https://dzen.ru/varechka_uni_physics