Поиск наивысшего ключа и значения в словаре

Я выполняю задание для курса Python — «слепой аукцион», где каждый пользователь вводит свое имя и ставку в пустой словарь.

Идея состоит в том, что вы просматриваете словарь и находите самый высокий ключ и значение («победитель» и «ставка»).

Видимо, согласно курсу, это нужно делать с помощью функции, которую я не совсем понимаю, так как я бы просто выполнял цикл for. Я пытался это сделать, но победителя не нашел.

Это код: «winner_bid» в pycharm говорит: значение локальной переменной «winner_bid» не используется.

empty_dictionary = {}
game_continue = True

def find_highest_bidder():
    winner_bid = None
    highest_bid = 0
    for key in empty_dictionary:
        if empty_dictionary[key] > highest_bid:
            highest_bid = empty_dictionary[key]
            winner_bid = key

while game_continue:
    name = input("What is your name?\n")
    bid = int(input("What is your price?\n"))
    empty_dictionary[name] = bid

    continue_input = input("Are there any more bidders? Type 'yes' or 'no'\n").lower()
    if continue_input == "no":
        game_continue = False
        find_highest_bidder()
        print(f"The winner is {winner_bid} with a bid of {highest_bid}")
    else:
        print("\n" * 20)

Ниже приведено правильное решение для контекста:

def find_highest_bidder(bidding_record):
    highest_bid = 0
    winner = ""
    for bidder in bidding_record:
        bid_amount = bidding_record[bidder]
        if bid_amount > highest_bid:
            highest_bid = bid_amount
            winner = bidder
    print(f"The winner is {winner} with a bid of ${highest_bid}")


bids = {}
continue_bidding = True
while continue_bidding:
    name = input("What is your name?: ")
    price = int(input("What is your bid?: $"))
    bids[name] = price
    should_continue = input("Are there any other bidders? Type 'yes or 'no'.\n")
    if should_continue == "no":
        continue_bidding = False
        find_highest_bidder(bids)
    elif should_continue == "yes":
        print("\n" * 20)
Почему в 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
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

PyCharm прав. Вы присваиваете значение winner_bid, но оно локально для функции и больше нигде в функции не используется. Если бы вы обошли это и попытались напечатать его вне функции, оно было бы неопределенным.

Обратите внимание, что ваше «правильное решение» печатает результаты из функции.

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

В текущем коде winner_bid — это локальная переменная внутри find_highest_bidder, которая обновляется по ходу цикла, но вы никогда ничего с ней не делаете.

Поскольку вы ссылаетесь на него в game_continue, похоже, вы хотели использовать его как глобальную переменную. Это сработало бы, но это не лучшая практика. Более надежный подход заключался бы в том, чтобы вернуть запись о самой высокой ставке и запись:

def find_highest_bidder():
    winner_bid = None
    highest_bid = 0
    for key in empty_dictionary:
        if empty_dictionary[key] > highest_bid:
            highest_bid = empty_dictionary[key]
            winner_bid = key
    return (winner_bid, highest_bid)

а затем используйте их в game_continue:

winner_bid, highest_bid = find_highest_bidder()

При этом функция find_highest_bidder вам действительно не нужна. Вы можете использовать встроенный максимум Python для элементов ставок:

winner_bid, highest_bid = max(bids.items(), key=lambda x: x[1])

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

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

import os, sys

CLEAR = ('clear', 'cls')[sys.platform.startswith('win')]
db    = {}

while True:
    os.system(CLEAR)
    
    # validate name
    while len((user := input("What is your name? "))) < 1:
        print("Your name must be at least 1 character.")
    
    # validate bid
    while not (bid := input("What is your price? ")).isdigit():
        print("You must input an integer.")
        
    # store
    db[user] = int(bid)

    # all we care about is "no" or "n" - anything else is considered "yes"
    if input("Are there more bidders? ").lower() in ('no', 'n'):
        os.system(CLEAR)
        user, bid = max(db.items(), key=lambda item: item[1])
        print(f"The winner is {user} with a bid of {bid}")
        break

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