data = [1,1,2,1,3,4] for num in data: if data.count(num) < 2: data.remove(num) return data
実行結果が[1,1,1,4]となるのはなぜでしょうか?
二個以上ある要素だけ残したつもりだっだのですが。。。
よろしくお願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
ループ中のその要素を削除したりするとすべての要素分、ループできません。
data を複製したもの(data[:]) をforに指定すればどうでしょうか。
data = [1,1,2,1,3,4]
for num in data[:]:
投稿2016/01/02 14:08
総合スコア674
0
リファレンスにこの事象に関する記載があります。
7.3 for文 注釈
どの要素が次に使われるかを追跡するために、内部的なカウンタが使われており、このカウンタは反復処理を行うごとに加算されます。このカウンタがシーケンスの長さに達すると、ループは終了します。このことは、スイート中でシーケンスから現在の ( または以前の ) 要素を除去すると、 ( 次の要素のインデクスは、すでに取り扱った要素のインデクスになるために ) 次の要素が飛ばされることを意味します。
わかりにくいと思うので、コードも。
python
1data = [0,1,2,3,4,5] 2counter = 0 3 4for num in data: 5 print "--------------" 6 print "counter " + str(counter) 7 print "before num " + str(num) 8 print "before length " + str(len(data)) 9 print "before list " + str(data) 10 if data.count(num) < 2: 11 data.remove(num) 12 print "--------------" 13 print "aftre num " + str(num) 14 print "after length " + str(len(data)) 15 print "after removed " + str(data) 16 counter += 1 17print "after process " + str(data)
実行結果
-------------- counter 0 before num 0 before length 6 before list [0, 1, 2, 3, 4, 5] -------------- aftre num 0 after length 5 after removed [1, 2, 3, 4, 5] -------------- counter 1 before num 2 before length 5 before list [1, 2, 3, 4, 5] -------------- aftre num 2 after length 4 after removed [1, 3, 4, 5] -------------- counter 2 before num 4 before length 4 before list [1, 3, 4, 5] -------------- aftre num 4 after length 3 after removed [1, 3, 5] -------------- counter 3 after process [1, 3, 5]
本来であれば全ての要素が削除されるはずですが、
実際に削除されたのは、[0, 2, 4]のみとなっていて、
次の要素の処理がスキップされています。
対処としては、yoshi777さんがおっしゃっている様に、リストのコピーを使用しての
for文を実行するのが良いかと思います。
投稿2016/01/03 02:46
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参考までに、こういうときはリスト内包表記やfilter等を使って新たにlistを生成した方がいい場合があります。
リスト内包表記
Python
1data = [1,1,2,1,3,4] 2data = [i for i in data if data.count(i) < 2] 3return data
filter ※Python2ではlistが返りますが、Python3ではイテレーターを返すので注意。
Python
1data = [1,1,2,1,3,4] 2data = filter(lambda i: data.count(i) < 2, data) 3return data
投稿2016/01/03 03:18
総合スコア21735
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/03 01:39