Python Grocery Program - 如何将每个项目分别乘以其数量?

时间:2016-03-26 00:18:26

标签: python python-3.x

我正在尝试编写一个创建商品清单的程序   确定每件商品的数量,计算购物清单上所有商品的小计,计算总金额,包括7%的销售税 并打印小计和总费用,但我的计划是将总价格乘以总数而不是乘以项目。

这是我的代码

item_num = int(input("Please enter the number of items on your grocery  list.\n"))
item_list = [str(input("What is the item #" + str(count + 1) + " on your list?\n")) for count in range(item_num)]
item_price = sum(int(input("Enter the price of the item \n")) for i in range(item_num))
item_quan = sum(int(input("What is the quantity of item #" + str(count + 1) + " that you bought?\n")) for count in range(item_num))
subtotal = sum(int(item_price * item_quan)for i in range(item_num))
print ("The subtotal is...")
print (subtotal)
tax = 0.07 * item_quan
total = subtotal + tax
print ("The grand total is...")
print (total)

这是我运行后的结果。

Please enter the number of items on your grocery list.
2
What is the item #1 on your list?
Bike
What is the item #2 on your list?
Gloves
Enter the price of the item 
100
Enter the price of the item 
15
What is the quantity of item #1 that you bought?
2
What is the quantity of item #2 that you bought?
1
The subtotal is...
345
The grand total is...
345.21

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

原因很简单:您未在item_priceitem_quan计算单个商品的价格或数量,而是计算其总和

具体来说,在

item_price = sum(int(input("Enter the price of the item \n")) for i in range(item_num))

item_quan = sum(int(input("What is the quantity of item #" + str(count + 1) + " that you bought?\n")) for count in range(item_num))

您首先创建了一个生成器表达式(手动波浪,您已经创建了一个列表),将每个输入转换为int,然后在sum上调用sum总清单。 sum获取一个列表并返回一个数字。但是你不想要单个数字(这是列表中所有项目的总和) - 你只需要为每个项目提供一系列相应的价格和数量。

只需删除subtotal电话即可。这完全没必要。它唯一应该放在int

更一般地说,这个代码示例并不是非常干净,因此可能是混乱的原因。我强烈建议在Code Review寻求帮助以改进它。例如,您在任何地方都有多个重复ints次呼叫,这些呼叫完全无关 - 两个ints的产品也是int,因此无需将其转换为map

然而,具体而言,我想推荐一些比您考虑的方法更接近的方法。这是通过使用lambdamap函数。

lambda正如它听起来的那样:它创建一个新数组,其元素通过将函数应用于旧数组中的每个元素来计算。

item_price = map(lambda item: int(input("Enter the price for this item: {0}".format(item)), item_list] 可以让你在现场创建一个函数(更准确地说,它创建了一个匿名函数,但是不要让你陷入困境)。

item_quan

类似的方法将为-(BOOL) textFieldShouldReturn:(UITextField *)textField{ [textfield resignFirstResponder]; [self.view endEditing:YES]; return YES; } -(IBAction)submitRequest { [textfield resignFirstResponder]; [self.view endEditing:YES]; // make API call, if call succeeds run this block { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"..." message:@"..." delegate:delegate cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; dispatch_async(dispatch_get_main_queue(), ^{ [alert show]; }); // } } // delegate after alert OK is pressed - (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { [self.navigationController popViewControllerAnimated:YES]; } 创造奇迹。请注意阅读更容易,以及您不需要依赖范围等原始结构。从地图的角度思考也会更加明显地发生了什么。

同样,请考虑使用Code Review。它是一个很好的工具,它将教你如何编写简洁明了的代码,而不仅仅是有用的东西。 :)

答案 1 :(得分:-1)

这是固定版本:

item_num = int(input("Please enter the number of items on your grocery  list.\n"))
item_list = [str(input("What is the item #" + str(count + 1) + " on your list?\n")) for count in range(item_num)]
item_price = [int(input("Enter the price of the item \n")) for i in range(item_num)]
item_quan = [int(input("What is the quantity of item #" + str(count + 1) + " that you bought?\n")) for count in range(item_num)]
subtotal = sum(int(quan * price) for quan, price in zip(item_quan, item_price))
print ("The subtotal is...")
print (subtotal)
tax = 0.07 * subtotal
total = subtotal + tax
print ("The grand total is...")
print (total)

您需要创建2个列表,而不是汇总item_priceitem_quan,而这些列表将包含每个项目的适当价格和数量。

我相信解决方案可以变得更漂亮,但我希望改变最少的代码而不是重写你的代码。