我正在尝试编写一个程序来删除列表中的重复项,但我的程序不断在第5行if n/(sequence[k]) == 1:
上抛出错误“list index out of range”。我无法弄清楚这一点。我是否正确地认为“k”的可能值是0,1和2?如何将“序列”作为索引超出可能的索引范围?
def remove_duplicates(sequence):
new_list = sequence
for n in sequence:
for k in range(len(sequence)):
if n/(sequence[k]) == 1:
new_list.remove(sequence[k])
print new_list
remove_duplicates([1,2,3])
答案 0 :(得分:3)
您的错误是同时修改列表:
for k in range(len(sequence)):
if n/(sequence[k]) == 1:
new_list.remove(sequence[k])
似乎从new_list中删除不应该影响序列,但是你在函数的开头做了new_list = sequence
。这意味着new_list实际上字面上是序列,也许你的意思是new_list=list(sequence)
来复制列表?
如果您接受它们是相同的列表,则错误很明显。删除项目时,长度和索引会更改。
P.S。正如@Akavall在评论中所提到的,您只需要:
sequence=list(set(sequence))
使序列不包含欺骗。如果您需要保留订购,另一个选择是:
from collections import OrderedDict
sequence=list(OrderedDict.fromkeys(sequence))
答案 1 :(得分:3)
我强烈建议Akavall回答:
list(set(your_list))
至于为何超出范围错误:Python通过引用传递,即序列和new_list仍然指向相同的内存位置。更改new_list也会改变顺序。
最后,您要将项目与自己进行比较,然后将其删除。所以基本上即使你使用了序列的副本,例如:
new_list = list(sequence)
或
new_list = sequence[:]
它将返回一个空列表。
答案 2 :(得分:1)
如果您不喜欢list(set(your_list))
,因为无法保证保留订单,您可以抓住the OrderedSet recipe然后执行:
from ordered_set import OrderedSet
foo = list("face a dead cabbage")
print foo
print list(set(foo)) # Order might change
print list(OrderedSet(foo)) # Order preserved
答案 3 :(得分:0)
# like @Akavall suggested
def remove_duplicates(sequence):
# returns unsorted unique list
return list(set(sequence))
# create a list, if ele from input not in that list, append.
def remove_duplicates(sequence):
lst = []
for i in sequence:
if i not in lst:
lst.append(i)
# returns unsorted unique list
return lst