【问题标题】:Loop exiting prematurely循环过早退出
【发布时间】:2024-05-23 00:50:02
【问题描述】:

我想编写一个接受列表和数字作为参数的函数。它将返回与该数字相加的项目列表。

例如func([1,2,3,4,5],7) 应该返回[5,2]。但是程序现在只返回[5]

这是算法的简化版本,我将作为更大项目的一部分使用,原始版本将有更多条件,但如果可行,我可以在此基础上构建,因此我是暂时忽略会破坏程序的事情,例如没有元素相加等。

def func(R,t):
    
    tog = t
    appr = 0
    rlist = []
    
    while True:
        
        if appr >= tog:
            break
        
        diff = [t-i for i in R]
        for i,v in enumerate(diff):
            if v == min(diff):
                rlist.append(R[i])
                appr += R[i]
                t -= R[i]
                R.remove(R[i])
                break
        return rlist

这个想法是,无论哪个元素(来自列表 R)与目标 (t) 的差异最小,都将添加到 rlist,并且该值将从作为参数发送的列表中删除。当达到目标值时,主循环中断。

我们将不胜感激解释为什么会发生这种情况以及如何解决它。

编辑 - diff [abs(tog - i) for i in R] 有效。

【问题讨论】:

  • 您的示例中是否还应包含 3 和 4? 1 + 2 + 4 怎么样?应该包括这 3 个数字,还是您只是对成对感兴趣?
  • @mhawke ,我想要最少数量的项目,所以 5,2 考虑到我的算法是这样编写的,它会首先选择 5,因为它最接近 7

标签: python-3.x algorithm loops


【解决方案1】:

return rlist 的缩进不正确。一旦for 循环终止,它将被调用。

您可能希望在while 循环之后返回,因此请删除return 语句的一级缩进。

现在您将在列表中获得更多结果,但可能是错误的。

顺便说一句,R.remove(R[i]) 将从传递给func() 的列表中删除项目。调用代码可能没想到它传递给func() 的列表会被修改。

【讨论】:

  • @bboyenergetic 你提到你的答案应该是[5,2]
  • @toRex,是的,但我得到 [5,4],这意味着它忽略了 t 的更改值