我无法弄清楚为什么这会导致"列表索引超出范围错误"。此代码旨在从列表中删除重复项。
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 :(得分:2)
new_list = l
使new_list
引用与l
相同的对象。对new_list
的任何更改都会影响l
,从而导致代码出错。您收到了超出范围的错误,因为您从new_list
中删除了l
中的项目,而这些项目实际上是从l
删除的,而您正在迭代new_list = l[:]
。
使用l
将new_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循环可以更快地跟踪你所看到的内容。