Мини-урок · перед практикой

Англо-латинский словарь

Переворачиваем каждую пару английское слово — латинский перевод.

Как к ней подойти

Потренируйтесь хранить пары «ключ - значение» и находить нужные записи в словаре.

Коротко о теме

Словарь связывает ключ со значением и позволяет быстро найти запись по ключу. Решите, что будет ключом, что значением и как обрабатывать отсутствующую запись. Для подсчётов удобно начинать с нуля.

Ключевая идея · Обратный словарь списков

Английские слова уже поступают по алфавиту, поэтому списки переводов автоматически упорядочены. Сортируем только латинские ключи.

Проверьте перед запуском

  • Соблюдайте разделители: пробелы вокруг дефиса и запятая с пробелом.
  • Первая строка — число латинских слов, а не число пар.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Обратный словарь списков

Английские слова уже поступают по алфавиту, поэтому списки переводов автоматически упорядочены. Сортируем только латинские ключи.

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) записей и слов.