2016-07-07 6 views
0

指定されたリスト内の一意のオブジェクトをすべて削除する必要があります。なぜ2と4が2つの例に残っていますか?

私のコードは1,3,4チェックをパスしますが、2番目のチェックをパスしません。[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に移動され、ループはインデックス0に移動された項目をスキップして、インデックス1の要素を表示するように移動します。このような

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 
関連する問題