列表索引超出范围

时间:2014-09-04 16:35:03

标签: python list

我无法弄清楚为什么这会导致"列表索引超出范围错误"。此代码旨在从列表中删除重复项。

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。

3 个答案:

答案 0 :(得分:2)

new_list = l使new_list引用与l相同的对象。对new_list的任何更改都会影响l,从而导致代码出错。您收到了超出范围的错误,因为您从new_list中删除了l中的项目,而这些项目实际上是从l删除的,而您正在迭代new_list = l[:]

使用lnew_list.pop(x)复制到新列表。

您的代码逻辑也有错误:{{1}}将更改所有以下元素的索引,这意味着下次删除元素时,它将从错误的索引中删除。

答案 1 :(得分:0)

您没有正确复制列表, new_list 指的是相同的内存位置,即 l 对象,因此您在new_list中所做的任何更改都会反映在l中。 为避免这种情况,您可以使用浅拷贝 例如: -

new_list=l[:]

答案 2 :(得分:0)

列表推导往往比循环更快,看起来很花哨。如果您打算创建一个删除了重复项的新列表,则可以执行此操作:

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])

如果你有一个包含许多重复项的非常大的列表,那么带有set()的for循环可以更快地跟踪你所看到的内容。