Англо-латинский словарь
Вы решили задачу. Теперь можно сравнить подходы.
Переворачиваем каждую пару английское слово — латинский перевод.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Обратный словарь списков
Английские слова уже поступают по алфавиту, поэтому списки переводов автоматически упорядочены. Сортируем только латинские ключи.
n = int(input())
reverse = {}
for _ in range(n):
english, translations = input().split(' - ')
for latin in translations.split(', '):
reverse.setdefault(latin, []).append(english)
print(len(reverse))
for latin in sorted(reverse):
print(latin + ' - ' + ', '.join(reverse[latin]))
Время: O(P + U log U) сравнений, P — число пар, U — число латинских слов; плюс чтение и вывод символов. Память: O(P) записей и памяти для слов.
Другой способ: Сортировка пар и группировка
Сортируем пары сначала по латинскому, потом по английскому слову, после чего объединяем соседние записи с одинаковым первым словом.
from itertools import groupby
n = int(input())
pairs = []
for _ in range(n):
english, translations = input().split(' - ')
for latin in translations.split(', '):
pairs.append((latin, english))
pairs.sort()
groups = [(latin, [english for _, english in group]) for latin, group in groupby(pairs, key=lambda pair: pair[0])]
print(len(groups))
for latin, english in groups:
print(latin + ' - ' + ', '.join(english))
Время: O(P log P) сравнений плюс длина текста. Память: O(P) записей и слов.
На что обратить внимание
- Соблюдайте разделители: пробелы вокруг дефиса и запятая с пробелом.
- Первая строка — число латинских слов, а не число пар.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.