'''
Інформація про кількість товарів певної групи заноситься в комп'ютер по мірі надходження товарів. Групи товарів
стандартизовані, шифруються трьома буквами алфавіту і кількість груп обмежена. Скласти програму, яка виводить на екран
зведену відомість наявності товарів по заданій при перерахуванні ознаці упорядкування.
'''
import string as str
while True:
    d, Flag = {}, True
    print('Якщо ви бажаєте вивести відомість введіть "0"')
    while Flag:
        while True:  # введення назви товару чи виклик відомості
            t = input('Товар: ')
            if t == '0' or (len(t) == 3 and set(t).issubset(set(str.ascii_letters))): #перевірка чи назва товару складається з трьох букв алфавіту
                break  # виходимо з цього циклу
            else:  # ще раз просимо користувача ввести дані, бо введені дані виявилися неправильними
                print('Неправильно введена назва товару. Спробуй ще раз')
        if t == '0':  # входимо в гілку для виведення відомості
            if len(d) > 0:  # перевірка на те, що користувач вже вводив відомості, щоб не виводити пусту відомість
                while True:
                    b = input('Вивести товари за впорядкуванням по алфавіту(1) чи за кількістю товарів(2)?  ')
                    if b == '1':  # гілка для впорядкування по алфавіту
                        while True:
                            b1 = input('Сортувати з початку(+) чи з кінця(-) алфавіту?  ')
                            if b1 == '+':  # впорядкування з початку алфавіту
                                x = sorted(d.keys())  # сортуємо ключі словника
                                break
                            elif b1 == '-':  # впорядкування з кінця алфавіту
                                x = sorted(d.keys(), reverse=True)  # сортуємо ключі у зворотньому порядку
                                break
                            else:  # ще раз запитуємо користувача про тип сортування, тому що він не ввів + або -
                                print('Введіть + або -')  #
                        for i in x:  # циклічно ввиводимо відомість згідно типу сортування
                            print(f'{i} - {d[i]}')
                        break
                    elif b == '2':  # гілка для впорядкування по кількості товарів
                        while True:
                            b1 = input('Сортувати за зростанням(+) чи спаданням(-)?  ')
                            if b1 == '+':  # сортування за зростанням
                                x = sorted(list(d.items()), key=lambda i: i[1])  # отримуємо кортеж зі словника (ключ, значення) \
                                break                                # сортуємо по значеннях, тобто по другому елементу
                            elif b1 == '-':  # сортування за спаданням
                                x = sorted(list(d.items()), key=lambda i: i[1], reverse=True)  # сортуємо в зворотньому порядку
                                break
                            else:  # ще раз запитуємо користувача про тип сортування, тому що він не ввів + або -
                                print('Введіть + або -')
                        for i in x:  # циклічно виводимо відомість згідно типу сортування
                            print(f'{i[0]} - {i[1]}')
                        break
                    else:  # ще раз запитуємо користувача про тип сортування, тому що він не ввів 1 або 2
                        print('Введіть 1 або 2')

                while True:  # запитуємо користувача чи хоче він завершити роботу, чи продовжити
                    ans = input('Бажаєте продовжити введення товарів(+) чи завершити роботу(-)?  ')
                    if ans == '+':
                        print('Якщо ви бажаєте вивести відомість введіть "0"')
                        break
                    elif ans == '-':
                        Flag = False
                        print('***The end***')
                        break
                    else:  # ще раз запитуємо користувача, тому що він не ввів + або -
                        print('Введіть + або -')
            else:
                print('Спочатку введіть відомості про товари.')
        else:
            while True:
                try:
                    n = int(input('Кількість: '))  # введення кількості товарів
                    break
                except ValueError:  # перехоплюємо помилку, якщо користувач ввів не число
                    print('Це не число')
            d[t] = d.get(t, 0) + n  # записуємо значення у словник (додаємо до існуючого або створюємо новий запис у словнику)

    answer = input('Бажаєте запустити програму ще раз? Так (+), ні (будь-що)')
    if answer == '+':
        continue
    else:
        break
