python - 用非暴力方法解决二和问题
问题描述
我正在学习用 python 编码,并编写了以下代码来解决列表中的两个和问题。我的方法如下:
- 占用列表 L 中的一个元素
- 从目标总和中减去元素值
- 检查此值是否在列表中的任何位置
- 如果它在那里,将它的索引添加到一个新列表中,并从原始列表中删除这个值 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)
解决方案
我猜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:]:
省略了已循环的项目,因此它仅返回一个求和对。