<p>问题是<code>elif</code>块没有分配<code>most_expensive_product</code>。因此,您可以在<code>if</code>块中分配<code>most_expensive_product</code>,在<code>elif</code>块中分配<code>smallest_product</code>和<code>productID</code>。这将导致在<code>remove</code>调用中构造一个元组,该元组一开始就不存在,因此无法删除</p>
<p>您可以通过在<code>elif</code>中添加赋值来解决这个问题,假设这是您的期望行为</p>
<pre><code>most_expensive_product = dairy_items[productNr][2]
</code></pre>
<p>我对您的变量名有点困惑,因为<code>most_expensive_product</code>似乎不是最昂贵的产品,而是最小产品的价格(或者如果有多个最小的项目,则价格更高)</p>
<p>如果我对您尝试执行的操作的假设是正确的,那么使用for循环会更好,这样您就避免了在索引和元组重建方面的麻烦。例如,下面的内容似乎与您的意图相符:</p>
<pre><code>def shelving(dairy_items):
filled = 0
worth = 0
shelves = []
while filled <= capacity:
chosen_product = dairy_items[0]
for product in dairy_items:
if product[1] < chosen_product[1]:
chosen_product = product
elif chosen_product[1] == product[1]:
if product[2] > chosen_product[2]:
chosen_product = product
filled = filled + chosen_product[1]
worth = worth + chosen_product[2]
shelves.append(chosen_product[0])
dairy_items.remove(chosen_product)
return (shelves, filled, worth)
</code></pre>
<p>然而,这仍然有一个问题,您的原始代码有;因为它只在循环开始时检查容量,所以它会将货架填满。这可以通过在末尾添加支票来解决,如下所示:</p>
<pre><code>def shelving(dairy_items):
filled = 0
worth = 0
shelves = []
while filled <= capacity:
chosen_product = dairy_items[0]
for product in dairy_items:
if product[1] < chosen_product[1]:
chosen_product = product
elif chosen_product[1] == product[1]:
if product[2] > chosen_product[2]:
chosen_product = product
if filled + chosen_product[1] <= capacity:
filled = filled + chosen_product[1]
worth = worth + chosen_product[2]
shelves.append(chosen_product[0])
dairy_items.remove(chosen_product)
else:
break
return (shelves, filled, worth)
</code></pre>