[英]Why does my code raise an error?
我正在进行编码练习:给定整数序列作为数组,确定是否可以通过从数组中删除不超过一个元素来获得严格递增的序列。
所以我写了这段代码:
def almostIncreasingSequence(sequence):
first_list, second_list = sequence, sequence
for i in range(len(sequence)-1):
if sequence[i] >= sequence[i+1]:
first_list.remove(sequence[i])
second_list.remove(sequence[i+1])
break
if first_list == sorted(set(first_list)) or second_list == sorted(set(second_list)):
return True
else:
return False
现在,这段代码似乎可以在大多数序列上运行,但是特别是这会引发错误:
print almostIncreasingSequence([1,3,2])
错误如下:
Traceback (most recent call last):
file.py3 on line ?, in getUserOutputs
userOutput = _runsppge(testInputs[i])
file.py3 on line ?, in _runsppge
return almostIncreasingSequence(*_fArgs_lujxeukjlbwc)
file.py3 on line 7, in almostIncreasingSequence
second_list.remove(sequence[i+1])
IndexError: list index out of range
我只是不明白列表索引怎么可能超出范围。有人知道吗?
由于您要从要迭代的同一列表中删除项目
for i in range(len(sequence)-1):
if sequence[i] >= sequence[i+1]:
first_list.remove(sequence[i]) # <-- removing item
second_list.remove(sequence[i+1]) # <-- removing item
break
并且,如注释中所述, first_list, second_list = sequence, sequence
不会创建任何新列表。 first_list, second_list,
和sequence
都在该行之后引用完全相同的列表对象。
EDITED
第一次删除后的列表( first_list.remove(sequence[i])
)少了一个元素,因此,如果此时i+1
进入边缘,它将超出范围。
像[1, 2, 3, 5, 4]
1,2,3,5,4]这样的列表。 当i
在元素5
(i是3)上时, if
语句被触发,则首先删除( first_list.remove(sequence[i])
),该语句之后,list有4个元素[1, 2, 3, 4]
,然后下一行尝试访问i+1
( second_list.remove(sequence[i+1])
)处的元素(元素4),因此它使(i为4) second_list.remove(sequence[i+1])
。
> c:\users\jeffrey\documents\github\wadi\example.py(4)almostIncreasingSequence()
3 for i in range(len(sequence)-1):
----> 4 if sequence[i] >= sequence[i+1]:
5 first_list.remove(sequence[i])
ipdb> next
> c:\users\jeffrey\documents\github\wadi\example.py(5)almostIncreasingSequence()
4 if sequence[i] >= sequence[i+1]:
----> 5 first_list.remove(sequence[i])
6 second_list.remove(sequence[i+1])
ipdb> first_list
[1, 3, 2]
ipdb> second_list
[1, 3, 2]
ipdb> next
> c:\users\jeffrey\documents\github\wadi\example.py(6)almostIncreasingSequence()
5 first_list.remove(sequence[i])
----> 6 second_list.remove(sequence[i+1])
7 break
ipdb> first_list
[1, 2]
ipdb> second_list
[1, 2]
ipdb>
即使我没有执行此行second_list.remove(sequence[i+1])
,因为first_list
和second_list
指向相同的位置。 换句话说,我们可以说一个是另一个的别名。 这样,如果可以更改,则second_list也将更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.