我需要删除给定列表中的所有唯一对象。
我的代码通过了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"
答案 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