Фильтрация по словарю для отображения элементов - PullRequest
0 голосов
/ 24 марта 2020

поэтому у меня есть словарь под названием library_collections, в котором находятся два других словаря, которые называются книги и фильмы.

Книги: содержит 8 переменных на книгу, а имена переменных определены в первой строке. Они включают в себя: название, автор, издатель, страницы, год, копии, доступные и ID. Поле «Копии» представляет количество копий, находящихся в коллекции. Поле «Доступно» представляет количество копий, доступных для оформления заказа в текущий момент времени. Поле идентификатора является уникальным идентификатором для элемента.

Фильмы: содержит 8 переменных на ход ie, а переменные определены в первой строке. Они включают в себя: название, директор, продолжительность, жанр, год, копии, доступные и ID. Поле «Копии» представляет количество копий, находящихся в коллекции. Поле «Доступно» представляет количество копий, доступных для оформления заказа в текущий момент времени. Поле идентификатора является уникальным идентификатором элемента.

Одна из задач, которую я должен выполнить с этим словарем, заключается в следующем: разрешить пользователю запрашивать отображение всей коллекции любой книги (набрав «db») или фильмы (набрав «dm»), просматривая результаты по 10 за раз. Пользователь должен иметь возможность нажать, чтобы перейти к следующей группе из десяти элементов, пока не будет показана вся коллекция. Пользователь должен иметь возможность нажать «m» (затем), чтобы выйти из процесса отображения и вернуться в меню опций.

Моя проблема в том, что я не могу заставить свой код отображать следующие 10 Предметы. Я не знаю, где я все испортил. Каждый раз, когда я запускаю код, появляются одни и те же 10 книг. Я знаю, что это как-то связано с моей функцией диапазона, и я знаю, что мне следует использовать функцию диапазона, но я не понимаю, почему она не перейдет на следующие 10.

def display_collection(library_collections):
count = 0
for i in range (count, count + 10):
    for id, info in library_collections.items():
        print("\nID:", id)
        count += 1
        for item in info:
            print(item, ":", info[item])
        if count == 10:
                answer = input("Press 'enter' to show more items, or type 'm' to return to the menu: ")
                if answer == "":
                    count += 10
                    display_collection(library_collections)
                elif answer == "m":
                    prompt_user_with_menu()

Пожалуйста, дайте мне знать если требуется какая-либо дополнительная информация.

Ключевой термин: library_collection - это мой внешний словарь, в котором содержится словарь книг и фильмов, который содержит различные экземпляры каждого из них.

Ключевой термин: prompt_user_with_menu () просто функция, которая печатает сокращения для пользователя, чтобы сообщить им, что они могут сделать. Например, будет напечатано db = показать все книги и dm = показать все фильмы.

1 Ответ

0 голосов
/ 25 марта 2020

Ваш текущий код имеет два цикла, когда они вам действительно не нужны. Более того, циклы на самом деле не делают то, что вы хотите, так как вы используете рекурсию для потока управления. Это часто хуже, чем придерживаться своих циклов и правильно их понимать.

В этом контексте, я думаю, вам нужен только один l oop. Подсказка «more» может быть вызвана подсчетом числа значений, которые мы итерировали, используя enumerate, а затем взяв модуль с оператором %:

def display_collection(library_collections):
    for count, (key, value) in enumerate(library_collections.items()):
        # display each item here, however you like
        print(value) # I'll just do this for simplicity, since I don't understand your data

        if count % 10 == 9: # this will be true after every 10th item
            menu = input("Press 'enter' to show more items, or 'm' to return to the menu: ")
            if menu == "m":
                return # we are presumably called by the menu function, so just go back there!
            # no else is needed, we just continue looping if anything else was entered

Как я отмечал в комментарии, вероятно, эта функция не должна обеспечивать повторное отображение меню, вместо этого она должна просто return вызывать ее. Возможно, он был вызван из самого меню, поэтому возвращаемый код - это именно то, к чему мы хотим вернуться! Просто сделайте так, чтобы код меню выполнялся в своем собственном l oop (и убедитесь, что все остальные функции, которые может запустить меню, также возвращаются к нему), и вы должны быть установлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...