Как использовать дозорные значения, отличные от входных и сортировать список по функциям? - PullRequest
0 голосов
/ 05 октября 2019

Я изучаю Python для начинающих, и есть один вопрос, на котором я застрял.

Этот вопрос включает в себя запрос пользователя на ввод любого количества выбранных грибов, ввод веса, а затем сортировку ихв соответствии с пользовательским вводом. Для этого требуется список и цикл while для добавления входных данных в список.

В настоящее время я пытаюсь реализовать значение часового значения, которое остановит цикл while после того, как будут введены все пользовательские входы,но установка часового как «STOP» конфликтует с уведомлением int ().

if __name__ == "__main__":
    STOP = "stop"
    mushroom = int(input("Enter a mushroom weight in grams, or STOP to end. "))
    total_list = []
    while total_list != STOP:
        total_list.append(mushroom)
        mushroom = int(input("Enter a mushroom weight in grams, or STOP to end. "))
    print(total_list)

Программа работает до тех пор, пока не введет «STOP», где появляется синтаксическая ошибка.

mushroom = int(input("Enter a mushroom weight in grams, or STOP to end. "))
ValueError: invalid literal for int() with base 10: 'STOP'

Как видите, значение СТОП-СТОП противоречит моему предложению ввода, что приводит к ошибке.

Что касается второй части проблемы, мне нужно отсортировать входные значения по весу. Если все сделано правильно, у меня должен быть список со всеми значениями. Какой код я могу использовать для сортировки значений? Мне нужно отсортировать каждое целочисленное значение на основе малого (<100), среднего (100-1000) и большого (> 1000), а затем распечатать результаты в выражении. Я немного не понимаю, что мне нужно делать здесь.

Спасибо, просто застрял в одном месте.

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Вы можете использовать ошибку, полученную при попытке преобразовать нецелое число в целое число в ваших интересах с try и except в Python. Вот документация для этого.

Переписав свой код, вы можете попробовать это:

if __name__ == "__main__":
    STOP = "STOP"
    total_list = []
    while True:
        try:
            user_input = input("Enter a mushroom weight in grams, or STOP to end. ")
            total_list.append(int(user_input))  
        except ValueError:
            if user_input.strip().upper()==STOP:
                break
            else:
                print("Incorrect entry! '{}' is not an integer".format(user_input))     

Затем, если вы хотите отсортировать этот список и разбить на категории,Вы можете рассмотреть возможность использования словаря:

total_list.sort()       
di={'Small':[],'Medium':[],'Large':[]}
for e in total_list:
    key='Small' if e<100 else 'Medium' if 100<=e<=1000 else 'Large'
    di[key].append(e)

print(total_list, sum(total_list),di)
0 голосов
/ 05 октября 2019

Первый сбой происходит, потому что вы пытаетесь разыграть «STOP» как int. Например, если вы откроете интерпретатор Python и введете int («STOP»), вы получите тот же сбой. Интерпретатор не знает, как преобразовать строку «STOP» в целое число. Лучшим способом может быть проверка того, может ли входная строка быть преобразована в целое число с помощью isdigit () или попытка / исключение.

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

if __name__ == "__main__":
    mushroom = None
    total_list = []
    while mushroom != "STOP":
        mushroom = input("Enter a mushroom weight in grams, or STOP to end. ")
        if mushroom.isdigit():
            total_list.append(int(mushroom))
    sorted_total_list = sorted(total_list)
    small_values = [mushroom for mushroom in total_list if mushroom < 100]
    medium_values = [mushroom for mushroom in total_list if 100 <= mushroom <= 1000]
    large_values = [mushroom for mushroom in total_list if mushroom > 1000]
    print(sorted_total_list)
    print(small_values)
    print(medium_values)
    print(large_values)
...