[英]Remove duplicates from list python
我正在尝试编写一个从列表中删除重复项的程序,但是if n/(sequence[k]) == 1:
:,我的程序会在第5行继续抛出错误“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])
您的错误是并发修改列表:
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)
,复制列表?
如果您接受它们是相同的列表,则错误是显而易见的。 删除项目时,长度和索引会更改。
PS正如@Akavall在评论中所提到的,您所需要的只是:
sequence=list(set(sequence))
使序列不包含欺骗。 如果您需要保留订购,另一个选择是:
from collections import OrderedDict
sequence=list(OrderedDict.fromkeys(sequence))
我强烈建议Akavall回答:
list(set(your_list))
至于你为什么超出范围错误:Python通过引用传递,即序列和new_list仍然指向相同的内存位置。 更改new_list也会改变顺序。
最后,您要将项目与自己进行比较,然后将其删除。 所以基本上即使您使用了序列的副本,例如:
new_list = list(sequence)
要么
new_list = sequence[:]
它会返回一个空列表。
如果你不喜欢list(set(your_list))
因为它不能保证保存顺序,你可以获取OrderedSet配方 ,然后执行:
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
# 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.