#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
orsalesMax
. Они могут быть созданы «на лету». - Вам нужно будет изменить способ печати вашего ответа, если вы используете мой код.
- Интересно, действительно ли вопрос, над которым вы работаете, хочет, чтобы вы подсчитали продажи по клиентам и нашли лучшего поставщика. В этом случае вам могут оказаться действительно удобными 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