首页 > 解决方案 > 用非暴力方法解决二和问题

问题描述

我正在学习用 python 编码,并编写了以下代码来解决列表中的两个和问题。我的方法如下:

  1. 占用列表 L 中的一个元素
  2. 从目标总和中减去元素值
  3. 检查此值是否在列表中的任何位置
  4. 如果它在那里,将它的索引添加到一个新列表中,并从原始列表中删除这个值 L

如果我删除“删除”命令,我的代码运行良好,但会产生双重结果。请帮助我识别错误。

l=[]
def two_sum(l,sval):
    result=[]
    for i in range(len(l)):
        new=sval-l[i]
        if new in l:
            result=result+[(i,l.index(new))]
            l.remove(new) 
    return(result)

标签: pythonalgorithmloops

解决方案


我猜list index out of range是您收到的错误。原因是在迭代列表时永远不要删除项目for loop:列表已被缩短,因为范围 (0, Len(l)) 中的相应索引已被删除。

我认为while loop带有两个指标的 a 可以更好地用于此目的。尝试这个:

def two_sum(l,sval):
    i=0
    j=0
    result=[]
    while i<len(l):
        new=sval-l[i]
        if new in l[j:]:
            result=result+[(i,l.index(new))]
            l[i], l[j]=l[j],l[i]
            j+=1
        i+=1
    return result, l[j:]

所以如果你测试:

l=list(np.arange(0,10,1))
two_sum(l,10)

它返回:

([(1, 9), (2, 8), (3, 7), (4, 6), (5, 5)], [0, 6, 7, 8, 9])

对在哪里[(1, 9), (2, 8), (3, 7), (4, 6), (5, 5)],并且是删除了总和对象[0, 6, 7, 8, 9]的原始列表。

另外,我想它比您提供的代码更有效:请注意,该行if new in l[j:]:省略了已循环的项目,因此它仅返回一个求和对


推荐阅读