2017-06-06 142 views
0

我正在做一個編碼練習:給定一個整數序列作爲數組,確定是否可以通過從數組中刪除不多於一個元素來獲得嚴格遞增的序列。爲什麼我的代碼會引發錯誤?

所以我寫了這個代碼:

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 

我只是不明白如何列表索引可能超出範圍..任何人都有線索?

+3

'first_list,second_list = sequence,sequence'不會創建任何新列表。 'first_list','second_list'和'sequence'都指向這一行後的完全相同的列表對象。 – user2357112

+1

有一個[快速指南](https://nedbatchelder.com/text/names.html)來說明Python變量和賦值如何工作。 – user2357112

+0

可能的提示https://stackoverflow.com/questions/43017251/solve-almostincreasingsequence-codefights –

回答

0

因爲你是去除相同的列表這你迭代上

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]這樣的列表。當i位於元素5(i爲3)時,則觸發if語句,然後發生第一次刪除(first_list.remove(sequence[i])),在該語句後,列表中有4個元素[1, 2, 3, 4],並且下一行嘗試訪問元素(元素4 )在i+1second_list.remove(sequence[i+1])),因此它得到(我是4)出界。

+0

是的好的,但是,如何像[1,2,3]這樣的序列工作並且不會引發錯誤? –

+0

@BartekSpitza,更新了答案。感謝您指出錯誤。 – Haris

+0

@BartekSpitza,列表'[1,2,3]','if'語句永遠不會執行。 – Haris

0
> 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_listsecond_list指向同一個位置。換句話說,我們可以說一個是另一個的別名。所以,如果可以改變,那麼second_list也會得到改變。

相關問題