2014-09-04 90 views
-3

我不明白爲什麼這是拋出「列表索引超出範圍錯誤」。此代碼旨在從列表中刪除重複項。列表索引超出範圍

def remove_duplicates(l): 
    new_list = l 
    for i in range(0,len(l)): 
     store = l[i] 
     for x in range(i+1,len(l)): 
     if l[x] == store: 
      new_list.pop(x) 
    return new_list 
print remove_duplicates([1,1,2,2]) 

感謝您的所有答案。所以我試了一下(經過相當大的挫折之後),我無法弄清楚這次有什麼不對。

def remove_duplicates(l): 
    new_list = l[:] 
    for i in range(0,len(l)): 
     count = 0 
     store = l[i] 
     for x in range(0,len(new_list)): 
      if l[x] == store: 
      count += 1 

     if count >= 2: 
     new_list.remove(l[i]) 

return new_list 
print remove_duplicates([1,1,2,2]) 

其中控制檯打印[2,2]。我使用了刪除功能,所以它不能成爲索引錯誤。我不明白它是如何在第二次迭代中刪除1的。我在第二個for循環中遍歷修改後的列表,在if條件中計數不能大於2。

+0

好的謝謝。我遇到了問題。就在你認爲自己寫了一段漂亮的代碼時呢?我喜歡這個論壇上的人們不要放棄它:) – user2474041 2014-09-04 16:40:22

+0

所以我不能用嵌套for循環來解決這個問題嗎? – user2474041 2014-09-04 16:41:49

+0

您可以使用嵌套for循環來完成此操作。你遇到麻煩了,因爲流行改變了你還沒有處理的列表部分。訣竅是向後遍歷列表。 – tdelaney 2014-09-04 16:52:27

回答

2

new_list = l使得new_list指代與l相同的對象。 new_list的任何更改將影響l,這會在您的代碼中導致錯誤。由於您從new_list中刪除了項目,而您在l之間迭代時實際上將它們從l中刪除,所以會出現超出範圍的錯誤。

使用new_list = l[:]l複製到一個新列表。

您的代碼邏輯也有錯誤:new_list.pop(x)將更改以下所有元素的索引,這意味着下次刪除元素時,它將從錯誤的索引中刪除。

0

你沒有正確複製列表中,您new_list是指相同的內存位置,即對象因此你在new_list做出的任何變化都會交運集團體現爲好。 爲了避免這種情況,你可以使用淺拷貝 例如: -

new_list=l[:] 
0

列表理解往往比for循環更快,看起來花哨啓動。如果你的目的是去除重複創建一個新的列表,這將做到這一點:

def remove_duplicates(mylist): 
    return [elem for i, elem in enumerate(mylist) if elem not in mylist[i+1:]] 

print remove_duplicates([1,1,2,2]) 

如果你有一個非常大名單有很多重複,一個爲一組()循環來跟蹤你已經什麼看到的可能會更快。