【问题标题】:Compute bill for a gem store计算宝石商店的账单
【发布时间】:2018-12-04 22:41:06
【问题描述】:

以下是我计算宝石商店账单的代码。 我能够从列表中获得正确元素的正确价格,但我无法弄清楚如何将它们与所需数量(reqd_qty 列表)相乘并计算总价格。

以下是完整的问题描述。

Tanishq Gems Store 向客户销售不同品种的宝石。

编写一个 Python 程序,根据宝石列表和购买数量计算客户要支付的账单金额。如果商店中没有客户需要的任何宝石,则认为总账单金额为-1。

假设客户对任何宝石的要求数量总是大于 0

def calculate_bill_amount(gems_list, price_list, reqd_gems,reqd_quantity):
bill_amount=0
#Write your logic here
for gem in gems_list:
    for g in reqd_gems:
        if g==gem:
            index = gems_list.index(g)
            price = price_list[index]
            print(price) 


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,2,5]

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

电流输出:

1760 # Ivory Price
2119 # Emerald Price
3999 # Garnet Price
0 # Bill amount

【问题讨论】:

    标签: python logic


    【解决方案1】:

    我建议您阅读字典,循环列表以匹配另一个列表中的值是非常低效的。 https://docs.python.org/3/tutorial/datastructures.html#dictionaries

    gems_list = ["Emerald", "Ivory", "Jasper", "Ruby", "Garnet"]
    price_list = [1760, 2119, 1599, 3920, 3999]
    reqd_gems = ["Ivory", "Emerald", "Garnet"]
    reqd_quantity = [3, 2, 5]
    
    quantity_dict = dict(zip(reqd_gems, reqd_quantity))
    price_dict = dict(zip(gems_list, price_list))
    print("Item", "Quantity", "Unit_price", "Total_price")
    for k, v in quantity_dict.items():
        print(k, v, price_dict[k], price_dict[k] * v)
    print("Grand_total", sum([price_dict[k] * v for k, v in quantity_dict.items()]))
    

    【讨论】:

      【解决方案2】:

      您的程序逻辑有两个主要缺陷。 第一个是您从不更新 bill_amount,这就是为什么您的答案返回 0。 其次,价格没有乘以所需数量。 这是重新设计的 calculate_bill_amount():

      def calculate_bill_amount(gems_list, price_list, reqd_gems,reqd_quantity):
      bill_amount=0
      #Write your logic here
      x=0 
      for g in reqd_gems:
          for gem in gems_list:
              if g==gem:
                  index = gems_list.index(g)
                  price = price_list[index]
                  bill_amount += price * reqd_quantity[x] 
                  print(bill_amount, price, reqd_quantity[x], x)
          x+=1
      return(bill_amount)
      

      @Bill .M 也正确地指出您没有考虑宝石不在列表中的情况

      【讨论】:

        【解决方案3】:

        正如在您之前删除同一问题之前对您的回答中指出的那样:bill_amount 应该只是您计算的所有价格的总和,因此在您的 print(price) 命令之后,尝试添加bill_amount += price。这会将bill_amount 的值设置为其当前值加上price 的新值。虽然您仍然没有将这个价格乘以它的数量。

        此外,您的代码没有解决 gem 不在可用性列表中的情况。所以解决这个问题的一种方法是如果g 不在gems_list 中,则跳过计算并返回-1。您可以使用命令“if g not in gems_list:”。

        def calculate_bill_amount2(gems_list, price_list, reqd_gems,reqd_quantity):
            bill_amount=0
            #Write your logic here
            for gem in gems_list:
                for g in reqd_gems:
                    if g==gem:
                        index = gems_list.index(g)
                        no_of_gems = reqd_quantity[reqd_gems.index(g)]
                        price = price_list[index] * no_of_gems
                        print(price)
                        bill_amount += price
                    if g not in gems_list:
                        return -1                
            return bill_amount
        

        坦率地说,我只是使用字典而不是列表,因为你做了很多不必要的循环:

        def calculate_bill_amount(gem_prices, reqd_gem_quantities):
            bill_amount = 0
            for gem in reqd_gem_quantities: 
                if gem in gem_prices:
                    price = gem_prices[gem] * reqd_gem_quantities[gem]
                    bill_amount += price
                else:
                    return -1
            return bill_amount
        
        gem_prices = { "Emerald": 1760, "Ivory": 2119, "Jasper": 1599, "Ruby": 3920, "Garnet": 3999 }
        reqd_gem_quantities = { "Ivory": 3, "Emerald": 2, "Garnet": 5 }
        
        print(calculate_bill_amount(gem_prices, reqd_gem_quantities))
        

        【讨论】:

          【解决方案4】:
          def calculate_bill_amount(gems_list, price_list, reqd_gems,reqd_quantity):
              bill_amount=0
              #Write your logic here
              j=0
              for i in reqd_gems:
                  if i in gems_list:
                      index=gems_list.index(i)
                      bill_amount=bill_amount+reqd_quantity[j]*price_list[index]
                      j=j+1
                  else:
                      bill_amount=-1
                      break
              if(bill_amount>30000):
                  bill_amount=bill_amount-(bill_amount*5/100)
          
              return bill_amount
          

          【讨论】:

          • 解释一下您所做的更改和/或您的答案与其他答案有何不同/更好,这总是有用的
          【解决方案5】:
          def calculate_bill_amount(gems_list, price_list, reqd_gems,reqd_quantity):
          bill_amount=0
          dict1={}
          dict2={}
          k=0
          for i in reqd_gems:
              dict2[i]=reqd_quantity[k]
              k+=1
          k=0
          for i in gems_list:
              dict1[i]=price_list[k]
              k+=1
          for i in dict2.keys():
              gem=i
              if gem in dict1.keys():
                  bill_amount+=dict1[gem]*dict2[gem]
              else:
                  bill_amount=-1
                  break
          if bill_amount>30000:
              bill_amount=bill_amount-(bill_amount*5/100)
          return bill_amount
          

          *上面的代码工作正常..在这里我创建了两个字典并映射了对应关系..但我也是编程新手,所以我不知道它是否有效*

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-22
            • 1970-01-01
            • 2011-11-16
            • 2015-07-03
            • 2011-02-06
            • 1970-01-01
            • 2011-09-13
            • 1970-01-01
            相关资源
            最近更新 更多