<p>您有几个问题:</p>
<p><strong>您没有数字,只有字符串:</strong></p>
<blockquote>
<pre><code>def getInput():
product_name = input("What is the product?") # string
product_price = input("What s the price?") # string
return (product_name, product_price)
</code></pre>
</blockquote>
<p>修正(只是价格输入部分):</p>
<pre><code> while True:
try:
product_price = int(input("What s the price?"))
if product_price <= 0:
raise ValueError
break
except ValueError:
print("Not a valid price")
</code></pre>
<p>请参阅<a href="https://stackoverflow.com/questions/23294658/asking-the-user-for-input-until-they-give-a-valid-response">Asking the user for input until they give a valid response</a>以了解如何避免<code>ValueError</code>的其他方法</p>
<p>只要没有数字,<code>'1000'</code>就会小于<code>'2'</code>(按字母顺序比较)。你知道吗</p>
<p><strong>您最便宜的项目计算并不能完成它应该做的事情:</strong></p>
<p>即使您将产品固定为有数字,您的<code>totalCost</code>也不起作用:</p>
<blockquote>
<pre><code>product[1] # this is the 2nd element of your list - not the price of it
def cheapestItem():
print("The cheapest item in this list is: ", min(products, key = lambda t: t[1]))
print("Congratulations you get this item free")
#calculate total
totalCost = sum(products[1]) - min(products[1])
</code></pre>
</blockquote>
<p>固定(f.e.):</p>
<pre><code> # assumes numbers in ("icecream", 42) - not strings
sortedItems = sorted(products, lambda x:x[1]) # sort by price ascending
minItem = sortedItems[0]
totalCost = sum(item[1] for item in sortedItems[1:]) # don't calc the lowest value
totalCost = sum(products[1]) - min(products[1])
</code></pre>
<p>使用<code>min()</code>也可以,但是通过排序,您可以使用列表切片对除最低值之外的所有值求和。如果您有<strong>庞大的</strong>列表-<code>min()</code>更为理想:</p>
<pre><code> minItem = min(products, lambda x:x[1])
total = sum(item[1] for item in products) - minItem[1] # reduced by minItems cost
</code></pre>
<hr/>
<p>我将代码固定为使用提供给函数的参数,而不是全局参数-也不需要min()产品列表,因为您可以对其进行排序-您只需切掉最低的项并扣除其值:</p>
<p>固定代码和示例输入:</p>
<pre><code>def getInput():
product_name = input("What is the product? ")
while True:
try:
# whole number prices assumed, else use float( input ( ... ))
product_price = int(input("What s the price? "))
if product_price <= 0:
raise ValueError
break
except ValueError:
print("Wrong input - prices must be greater 0 and whole numbers")
return (product_name, product_price)
def showTable(p):
for x in p:
print("Product Name | Price: ", x[0],x[1])
def cheapestItem(p):
# assumes sorted list of items in p
print("The cheapest item in this list is: ", p[-1])
print("Congratulations you get this item free")
#calculate total
totalCost = sum(i[1] for i in p[:-1])
print("Total Cost:", totalCost, "You saved:", p[-1])
products = []
for x in range(5):
product = getInput()
products.append(product)
# sort list - cheapestItem(..) needs a sorted input to work
products.sort(key=lambda t: t[1], reverse=True)
showTable(products)
cheapestItem(products)
</code></pre>
<p>输出:</p>
<pre><code>What is the product? apple
What s the price? 22
What is the product? pear
What s the price? 11
What is the product? kiwi
What s the price? 5
What is the product? pineapple
What s the price? no idea
Wrong input - prices must be greater 0 and whole numbers
What s the price? 100
What is the product? gears
What s the price? 1
Product Name | Price: pineapple 100
Product Name | Price: apple 22
Product Name | Price: pear 11
Product Name | Price: kiwi 5
Product Name | Price: gears 1
The cheapest item in this list is: ('gears', 1)
Congratulations you get this item free
Total Cost: 138 You saved: ('gears', 1)
</code></pre>