1

リストの一意の要素を削除する必要があります。最初に考えたのは次のとおりです。

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]

どうしてか言ってくれない?

4

2 に答える 2

0

各反復を見てください。

  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% の確率で問題が発生します。

于 2013-11-12T07:54:40.833 に答える
0

使用するとき

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] がリストに追加されます。

于 2013-11-12T08:21:18.653 に答える