Найти тему
Варечка Окаянная

Python МГУ МФК часть 5 осень 2023

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

-2