Поиск нескольких максимальных значений

#python #python-3.x

#python #python-3.x

Вопрос:

Я работаю над следующей проблемой:

Супермаркет хочет вознаградить своего лучшего клиента за каждый день, показывая имя клиента на экране в супермаркете. Для этой цели сумма покупки клиента сохраняется в одном списке, а имя клиента — в другом списке. Реализуйте функцию nameOfBestCustomer(продажи, клиенты), которая возвращает имя клиента с наибольшей продажей. Напишите программу, которая предложит кассиру ввести все цены и названия, добавит их в два списка, вызовет реализованный вами метод и отобразит результат. Используйте значение 0 в качестве контрольной величины.

У меня есть следующий код, работающий должным образом, за исключением того, что он не учитывает нескольких клиентов с одинаковой суммой покупки, равной максимальной. Есть предложения о том, как я мог бы легко решить эту проблему? Я, очевидно, новичок в Python, поэтому любые другие предложения, которые у вас могут возникнуть, также приветствуются! Спасибо!

 sales = []
customers = []

def customerSales() :
        salesEntry = 0.01
        customersEntry = 0

        while salesEntry > 0 :
                salesEntry = float(input("Enter new purchase amount or a 0 to finish: "))
                if salesEntry > 0 :
                        sales.append(salesEntry)
                        customersEntry = input("Enter customer name: ")
                        customers.append (customersEntry)
customerSales()


def nameOfBestCustomer(sales, customers) :
#@param: sales and customers lists
#@return: none

        bestCustomer = ""
        salesMax = 0

        salesMax = max(sales)
        index = sales.index(salesMax)
        bestCustomer = customers[index]
        print("The best customer of the day was "   bestCustomer   ".")
        print("They spent $%.2f" % salesMax   ".")

nameOfBestCustomer(sales, customers)
  

Ответ №1:

Прямо сейчас вы используете index , чтобы привлечь первого клиента с максимальными продажами. Похоже, вы хотите получить всех клиентов, которые привязаны к этому максимальному объему продаж. Есть несколько способов сделать это, но понимание списка было бы особенно питоническим:

 indices = [sale for sale in sales if sale == salesMax]
  

Затем, чтобы возвращать клиентов, вы могли бы использовать другое понимание списка:

 bestCustomers = set(customers[index] for index in indices)
  

Вы можете прочитать больше о понимании списков здесь. Обратите внимание, второй пример не является «списком», но он использует тот же синтаксис понимания для создания генератора. Я ввел это в python set , чтобы убедиться, что он возвращает разных клиентов.

Другие соображения

  • Вам не нужно заранее устанавливать bestCustomer or salesMax . Они могут быть созданы «на лету».
  • Вам нужно будет изменить способ печати вашего ответа, если вы используете мой код.
  • Интересно, действительно ли вопрос, над которым вы работаете, хочет, чтобы вы подсчитали продажи по клиентам и нашли лучшего поставщика. В этом случае вам могут оказаться действительно удобными zip и groupBy.

Ответ №2:

После нахождения maxSale вы можете запустить цикл для поиска всех максимальных продаж и клиентов. Также вам нужно составить список лучших клиентов. Надеюсь, это поможет.

 def nameOfBestCustomer(sales, customers) :
    #@param: sales and customers lists
    #@return: none

    bestCustomers = []
    salesMax = 0

    salesMax = max(sales)
    for i, sale in enumerate(sales):
        if sale == salesMax:
            bestCustomers.append(customers[i])

    print("The best customer of the day was", end='')
    for customer in bestCustomers:
        print(' '   customer, end='')
    print('.')
  

Ответ №3:

Если ваш результат имеет несколько одинаковых максимальных значений, вы можете изменить свою nameOfBestCustomer функцию на эту:

 def nameOfBestCustomer(sales, customers) :
#@param: sales and customers lists
#@return: none

    bestCustomer = ""
    salesMax = 0

    salesMax = max(sales)
    for i in range(len(customers)):
        if sales[i] == salesMax:
            print("The best customer of the day was "   customers[i]   ".")
    print("They spent $%.2f" % salesMax   ".")
  

Комментарии:

1. Спасибо! Я пытался продумать это таким образом, но я продолжаю путаться с range (len()). Думаю, мне нужно еще кое-чему научиться!

2. @Katie len(customers) возвращает длину списка клиентов, а range функция генерирует последовательность чисел. например, range(3) возвращает [0, 1, 2] или range(10) возвращает [0,1,2,3,4,5,6,7,8,9] . затем range(len(customers)) повторно возвращает список, содержащий все числа от нуля до длины customers