リストの一意の要素を削除する必要があります。最初に考えたのは次のとおりです。
def cut_uniq(data):
for x in data:
if data.count(x) == 1:
data.remove(x)
print(data)
cut_uniq([1, 2, 3, 4, 5,])
戻る
[2, 4]
どうしてか言ってくれない?
リストの一意の要素を削除する必要があります。最初に考えたのは次のとおりです。
def cut_uniq(data):
for x in data:
if data.count(x) == 1:
data.remove(x)
print(data)
cut_uniq([1, 2, 3, 4, 5,])
戻る
[2, 4]
どうしてか言ってくれない?
各反復を見てください。
i x data
0 1 [1,2,3,4,5]
1 3 [2,3,4,5]
2 5 [2,4,5]
[2,4]
変更しているリストとは異なるリストを反復処理できます。これはリストのコピーを返します
def cut_uniq(data):
return [x for x in data if data.count(x) > 1]
またはより効率的に
from collection import Counter
def cut_uniq(data):
return [x for x, count in Counter(data) if count > 1]
本当に元のリストを変更したいが、コピーを返さない場合
def cut_uniq(data):
i = 0
while i < len(data):
if data.count(data[i]) == 1:
del data[i]
else:
i += 1
また
from collections import Counter
def cut_uniq(data):
for x, count in Counter(data):
if count == 1:
data.remove(x)
繰り返しながら同じリストを変更すると、95% の確率で問題が発生します。
使用するとき
for x in data:
それはに変換されます
for i in [0,1,2,3,4]: x = データ[i]
したがって、最初のループでは、i = 0 data[i]=1 です。データから 1 を削除すると、データは [2,3,4,5] になります。
2 番目のループでは、i = 1 です。現在、データは [2,3,4,5] であり、data[i] = 3 であるためです。したがって、2 はデータ リストに残され、アクセスされることはありません。
4番と同じ。
したがって、ループを終了すると、[2,4] がリストに追加されます。