Как сопоставить ввод с элементами в списке / словаре в Python3

Я новичок в программировании и пытаюсь создать список магазинов с товарами и ценами. То есть после ввода всех элементов функция должна вычислить сумму и остановиться, как только вы превысите бюджет. Итак, я написал что-то вроде:

def shoplist():
    list = {"apple":30, "orange":20, "milk":60......}
    buy=str(input("What do you want to purchase?")
    If buy in list:
        While sum<=budget:
            sum=sum+??
shoplist ()

Я действительно не знаю, как сопоставить ввод товара с ценой в списке ... Моя первая мысль - использовать «если», но это непрактично, когда у вас более 10 элементов в списке и случайные входы. Я отчаянно нуждаюсь в помощи .... Так что любые предложения были бы хороши !! (или если у вас есть лучшее решение и вы думаете, что я пишу его таким образом, это полный мусор ... ПОЖАЛУЙСТА, дайте мне знать, что это за лучшие решения???

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
142
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Код, который вы публикуете, не будет работать на Python. list является встроенным модулем, и его не следует использовать для имени переменной, и он вдвойне сбивает с толку, поскольку здесь ссылается на объект dict. input() уже возвращает str, поэтому приведение не имеет никакого эффекта. if и while должны быть в нижнем регистре, без отступов, поэтому у нас нет возможности узнать пределы этих операторов.

Так много всего не так, взгляните на это:

def shoplist(budget):
    prices = {"apple":30, "orange":20, "milk":60}

    # Initialise sum
    sum = 0

    while sum <= budget:
        buy = input("What do you want to purchase?")

        # Break out of the loop if the user hts <RETURN>
        if not buy: break

        if buy in prices:
            sum += prices[buy]   # This gets the price
        else:
            print("Invalid item", buy)

shoplist(142)

Так что же я изменил? Бюджет должен быть откуда-то, поэтому я передаю его как параметр (142, это я придумал). Я инициализирую сумму до нуля и перемещаю цикл while наружу.

Обратите внимание на большое количество пробелов - это упрощает чтение кода и не влияет на производительность.

Нужно внести множество улучшений. Пользователю должен быть показан список возможных товаров и цен, а также оставшийся бюджет для каждой покупки. Также обратите внимание, что можно использовать сверх бюджета, так как у нас может быть только 30 в бюджете, но мы все еще можем покупать молоко (а это 60) - нам нужен еще один чек (выписка if) там!

Я оставлю вам улучшения. Повеселись!

Взгляните на это как на пример:

# this is a dictionary not a list
# be careful not using python reserved names as variable names
groceries = {
    "apple":30, 
    "orange":20, 
    "milk":60
}

expenses = 0
budget = 100
cart = []
# while statements, as well as if statements are in lower letter
while expenses < budget:
    # input always returns str, no need to cast
    user_input = input("What do you want to purchase?")
    if user_input not in groceries.keys():
        print(f'{user_input} is not available!')
        continue
    if groceries[user_input] > budget - expenses:
        print('You do not have enough budget to buy this')
        user_input = input("Are you done shopping?Type 'y' if you are.")
        if user_input == 'y':
            break
        continue
    cart.append(user_input)
    # this is how you add a number to anotherone
    expenses += groceries[user_input]
print("Shopping cart full. You bought {} items and have {} left in your budget.".format(len(cart), budget-expenses))

Я внес некоторые изменения в ваш код, чтобы он работал, с объяснением, включая использование комментариев, обозначенных символом #.

Две самые важные вещи - это то, что все круглые скобки должны быть закрыты:

fun((x, y)  # broken
fun((x, y)) # not broken

а ключевые слова в Python все в нижнем регистре:

if, while, for, not # will work
If, While, For, Not # won't work

Вас могут смутить True и False, которые, вероятно, должны быть в нижнем регистре. Они так долго были такими, что менять их уже поздно.

budget = 100 # You need to initialize variables before using them.

def shoplist():
    prices = {         # I re-named the price list from list to prices
        'apple'  : 30, # because list is a reserved keyword. You should only
        'orange' : 20, # use the list keyword to initialize list objects.
        'milk'   : 60, # This type of object is called a dictionary.
    } # The dots .... would have caused an error.
    # In most programming languages, you need to close all braces ().
    # I've renamed buy to item to make it clearer what that variable represents.
    item = input('What do you want to purchase? ')
    # Also, you don't need to cast the value of input to str; 
    # it's already a str.
    if item in prices:
        # If you need an int, you do have to cast from string to int.
        count = int(input('How many? ')) 
        cost = count*prices[item] # Access dictionary items using [].
        if cost > budget:
            print('You can\'t afford that many!')
        else:
            # You can put data into strings using the % symbol like so:
            print('That\'ll be %i.' % cost) # Here %i indicates an int.
    else:
        print('We don\'t have %s in stock.' % item) # Here %s means str.

shoplist()

Многие новички публикуют неработающий код в StackOverflow, не сообщая, что у них возникают ошибки или что это за ошибки. Всегда полезно публиковать сообщения об ошибках. Дайте мне знать, если у вас возникнут вопросы.

Другие вопросы по теме