为什么2和4仍然在2个例子中?

时间:2016-07-07 01:03:35

标签: python python-2.7 python-3.x

我需要删除给定列表中的所有唯一对象。

我的代码通过了1,3,4次检查,但没有通过第二次检查,它返回[2,4],为什么不通过[]?

def checkio(data):
     for i in data:
         if data.count(i) == 1 :
             data.remove(i)
     return data

if __name__ == "__main__":

    assert isinstance(checkio([1]), list), "The result must be a list"
    assert checkio([1, 2, 3, 1, 3]) == [1, 3, 1, 3], "1st example"
    assert checkio([1, 2, 3, 4, 5]) == [], "2nd example"
    assert checkio([5, 5, 5, 5, 5]) == [5, 5, 5, 5, 5], "3rd example"
    assert checkio([10, 9, 10, 10, 9, 8]) == [10, 9, 10, 10, 9], "4th example"

2 个答案:

答案 0 :(得分:2)

这里的问题是你在迭代它时从列表中删除元素,这是你永远不应该做的。

迭代for i in data不断移动正在向前看的索引。因此,当您删除列表中的第一个元素时,下一个项目将移动到索引0,然后循环继续查看索引1处的元素,跳过已移动到的项目index 0

相反,您可以建立一个包含符合条件的项目的新列表:

items = []
for i in data:
    if (data.count(i) > 1):
        items.append(i)
return items


或者做这样的事情:

return [i for i in l1 if l1.count(i) > 1]

答案 1 :(得分:0)

'删除'功能会自动重新创建列表。因此,当“1”被移除时,“2”被放入该槽中,因此它不会再次检查相同的位置,这就是为什么交替的项目仍然存在的原因。但是,您仍然可以实现与您相同的功能,而是从列表的后面开始工作并迭代到前面:

def checkio(data):
     for i in range(len(data)-1,-1,-1):
         if data.count(data[i]) == 1 :
             data.remove(data[i])
     return data