对于[1,2,2,5,5,5,7,7],我得到了这个输出[1,2,5,7],这很好。但是,对于[4,9,9,4],输出为[9,9,4],这是错误的。我无法找出问题所在。几个星期前我开始学习编程,所以我是新手。谢谢!
我的代码:
def remove_duplicates(l):
nl = list(l)
i = 0
while i <= len(nl)-2:
j = i + 1
while j <= len(nl)-1:
if nl[i] == nl[j]:
nl.remove(nl[j])
else:
j += 1
i += 1
return nl
答案 0 :(得分:2)
您想要使用set
。一组将删除重复
def remove_duplicates(l):
return list(set(l))
l_1 = [1,1,2,2]
l_2 = remove_duplicates(l_1)
print l_1
print l_2
输出:
[1, 1, 2, 2]
[1, 2]
或者,使用您的其他列表:
[4, 9, 9, 4]
[9, 4]
请注意,该函数将set
包裹在list
中,否则您将获得set
,而不是新的list
。
答案 1 :(得分:2)
set
删除重复:
>>> a = [1, 2, 2, 5, 5, 5, 7, 7]
>>> set(a)
set([1, 2, 5, 7])
如果您回溯,请在代码中:
0 i # here i is 0
1 j # here j is 0
4 duplicate element first duplicate element found at last that is 4, but removed from front
1 i # now list is [9,9,4] but i is 1 and j is 2
2 j
[9, 9, 4]
因此9和9不匹配,因此未删除
所以在您的代码中,如果您放置del(nl[j])
,它将正常工作。
答案 2 :(得分:0)
您可以通过将列表对象转换为set
来查看重复数据删除。
my_list = [4, 9, 9, 4]
deduped = list(set(my_list))
print deduped # prints [9, 4]
答案 3 :(得分:0)
你的主要问题是
行nl.remove(nl[j])
您想删除索引j处的项目。这一行实际上做的是删除索引j中包含的值的第一次出现。
相反,请尝试
del nl[j]
修改强>
让我们跟踪您的示例,remove_duplicates([4,9,9,4])
:
nl = [4, 9, 9, 4]
i = 0
j = 1
nl[0] != nl[1]
j = 2
nl[0] != nl[2]
j = 3
nl[0] == nl[3]
此时,你想通过调用
来摆脱nl[3]
nl.remove(nl[3])
但看看会发生什么:
>>> [4, 9, 9, 4].remove(4) # you expect [4, 9, 9, {deleted}]
[9, 9, 4] # but get [{deleted}, 9, 9, 4]
通过移动数组导致更多问题 - i
和j
不再指向相同的项目。
原因很简单:
>>> help(list.remove)
L.remove(value) -> None -- remove first occurrence of value.
^^ ^^
您告诉它删除值,而不是位置。
如果你做了
nl = [4, 9, 9, 4]
del nl[3] # delete a *location*, not a *value*
# gives [4, 9, 9, {deleted}]
你得到了你期待的结果。
答案 4 :(得分:0)
对于[4, 9, 9, 4]
,如果您希望[4, 9]
成为输出,则仅使用list(set(a))
的其他答案将无法保留订单。
保留订单使用:
def remove_duplicates(l):
s = set()
o = []
for i in l:
if i not in s:
s.add(i)
o.append(i)
return o
看到:
>>> remove_duplicates([4, 9, 9, 4])
[4, 9]