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

Это домашнее задание.Я просто спрашиваю о методе решения этой проблемы, а не обо всем решении.

Вопрос в следующем:

Напишите программу на Python для расчета суммы счета, подлежащего оплатеклиент на основе списка драгоценных камней и количества приобретенных.Любая покупка с общей суммой счета выше 30000 рупий имеет право на скидку 5%.Если какой-либо драгоценный камень, требуемый покупателем, недоступен в магазине, то следует считать, что общая сумма счета равна -1.

. Предположим, что количество, требуемое покупателем для любого драгоценного камня, всегда будет больше 0. Выполните case-чувствительное сравнение, где это применимо.

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

def calculate_bill_amount(gems_list, price_list, reqd_gems, reqd_quantity):
   bill_amount = 0
   # this is the portion where I should write my logic

   return bill_amount

# List of gems available in the store
gems_list = ["Emerald", "Ivory", "Jasper", "Ruby", "Garnet"]

# Price of gems available in the store. gems_list and price_list have one-to-one correspondence
price_list = [1760, 2119, 1599, 3920, 3999]

# List of gems required by the customer
reqd_gems = ["Ivory", "Emerald", "Garnet"]

# Quantity of gems required by the customer. reqd_gems and reqd_quantity have one-to-one correspondence
reqd_quantity = [3, 10, 12]

bill_amount = calculate_bill_amount(gems_list, price_list, reqd_gems, reqd_quantity)
print(bill_amount)

Ожидаемый результат - общая сумма счета.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Как и в ответе @ Bazingaa, я рекомендую использовать для этой работы отображение (Python dict).

Сначала вы можете создать отображение "Gem to price" следующим образом:

price_map = {}  # This is an empty dict
for i in range(len(gems_list)):
    price_map[gems_list[i]] = price_list[i]

Затем для каждого драгоценного камня, который хочет заказчик, вы можете проверить, есть ли он в наличии:

wanted = "Invalid"
has_gem = wanted in price_map
#         ^^^^^^^^^^^^^^^^^^^

Вы сможете обработать исключение, что искомый драгоценный камень недействителензатем.

Вы можете получить цену с помощью словаря поиска:

wanted = "Ruby"
price = price_map[wanted]  # this will fetch 3920

Если вы понимаете продвинутые методы, такие как списки, диктовки, распаковка значений и встроенные zip, тогда это здорово, и вы сможете писать более короткие программы:

price_map = {gem: price for gem, price in zip(gems_list, price_list)}

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

try:
    bill_amount += quantity * price_map[gem]
except KeyError:
    # One of the gems isn't available
    return -1

Если вам нужно прямое решение, просто прочитайте Bazingaa ответ .

0 голосов
/ 21 декабря 2018

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

def calculate_bill_amount(gems_list, price_list, reqd_gems, reqd_quantity):
   bill_amount = 0
   for i in range(len(reqd_gems)):
       ## we walk through every item in reqd_gems
       ## for every item in the list, we assume it's not available until we have found it in gems_list
       itemIsAvailable = False
       for j in range(len(gems_list)):
           # for every item in in reqd_gems, we walk through all the items in gems_list until we find the same item
           if reqd_gems[i] == gems_list[j]:
               itemIsAvailable = True
               # if we have found the same item, then it's available
               bill_amount += price_list[j] * reqd_quantity[i]
               # and we use the fact that the two pairs of lists have 1-to-1 correspondence to calculate the amount to add to bill_amount

       if not itemIsAvailable:
           return -1

   if bill_amount > 30000:
       return bill_amount * 0.95
   return bill_amount
0 голосов
/ 21 декабря 2018

Вот решение и логика:

Объяснение: Создайте словарь ваших драгоценных камней и соответствующую цену в функции, используя dict(zip()).Затем переберите нужные драгоценные камни и получите соответствующее значение / цену этого драгоценного камня и умножьте его на количество.Чтобы получить количество из списка, я использовал перечисление, чтобы получить доступ к соответствующему индексу.

Продолжайте добавлять его в bill_amount внутри цикла for и возвращать вне цикла for

def calculate_bill_amount(gems_list, price_list, reqd_gems,reqd_quantity):
    bill_amount=0
    d = dict(zip(gems_list, price_list))
    for i, gem in enumerate(reqd_gems):
        bill_amount += d[gem]*reqd_quantity[i]

    return bill_amount

bill_amount=calculate_bill_amount(gems_list, price_list, reqd_gems, reqd_quantity)
print(bill_amount)
# 71945
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...