2016-07-07 29 views
0

我需要刪除給定列表中的所有唯一對象。爲什麼2和4仍然在2個例子中?

我的代碼通過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

這裏的問題是,你是刪除元素從列表中,同時通過它迭代,你永遠不應該這樣做。

迭代for i in data不斷移動它正在查看的索引。因此,當您刪除列表中的第一個元素時,下一項將移動到索引0,循環繼續查看索引1處的元素,跳過移至索引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] 
+0

是啊,我這樣做了,謝謝!!!! –

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 
相關問題