2017-10-27 14 views
-2

リストのすべての要素をインデックス4から9に削除します。 以下のコードが動作しないのはなぜですか?Pythonで範囲を使用して削除する

m=[0,1,2,3,4,5,6,7,8,9] 
for i in range(4,10,1): 
    del m[i] 

出力である:

Traceback (most recent call last): 
    File "<pyshell#45>", line 2, in <module> 
    del m[i] 
IndexError: list assignment index out of range 

しかし、この後のMの内容は `なる[0、1、2、3、5、7、9]

+0

要素4を削除すると、すべての上位要素が下に移動してギャップを埋めることができます。したがって、削除する次のインデックスは1つだけオフになります。別の要素を削除するたびに、オフセットを増やして間違った要素を削除しています。 – khelwood

+0

[forループのリスト要素をPythonで削除するにはどうすればいいですか?](https://stackoverflow.com/questions/10665591/how-to-remove-list-elements-in-a-for-loopin -python) –

答えて

1

一つの問題は、ということですdel m[i]が同時に発生するわけではありません。 iの値が増加すると、mのサイズが減少するため、元の要素は元の位置になくなり、左に移動しています。

いずれの場合も、要素の範囲を削除するより良い方法は、例えば、スライスを使用している:

m[start:end] = [] 

これはインデックスstart持つ要素を削除.. end - 1

そして、あなたがステップにスライスしてdelを使用することができ、範囲内のステップを使用するには:削除あなたのループ内のすべての要素、インデックスとリストの長さが変化するために

del m[start:end:step] 
+0

ありがとうございます。 :-)うまくいった。 –

+0

stepを使用して要素を削除する方法を提案できますか?別の要素を削除したい場合はどうですか? –

+0

@Knight_botこの場合、 'del m [start:end:step]'を使うことができます。 – janos

0

。ある時点で、あなたはリストの長さよりも高いインデックスにアクセスしています。

はちょうどそのため、リストのスライスを使用する:あなたは要素を削除しているよう

# If you want the first 4 elements 
m=[0,1,2,3,4,5,6,7,8,9] 
print(m[:4]) # prints [0,1,2,3] 

# Or if you want to go slicing from reverse: 
m=[0,1,2,3,4,5,6,7,8,9] 
print(m[:-6]) # prints [0,1,2,3] 
2

リストのサイズが縮小しています。例えばこれを取る:あなたは、インデックスを削除すると、スクリプトが失敗した見ることができます

m=[0,1,2,3,4,5,6,7,8,9] 

for i in range(4,10,1): 
    print(i) 
    del m[i] 
    print(m) 

出力

Traceback (most recent call last): 
line 5, in <module> 
    del m[i] 
IndexError: list assignment index out of range 
4 
[0, 1, 2, 3, 5, 6, 7, 8, 9] 
5 
[0, 1, 2, 3, 5, 7, 8, 9] 
6 
[0, 1, 2, 3, 5, 7, 9] 
7 

Process finished with exit code 1 

は7ですが、リストのインデックス範囲は0-6である、したがって、インデックスがあること範囲外です。

0

反復処理中のシーケンスから削除しています。アイテムを削除すると、残りの位置が変更されます。

あなたは最高のインデックスから開始し、逆の順序でこれを行うことができますが、範囲の境界で注意しなければならない:

m = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
for i in range(9, 3, -1): 
    m.pop(i) 

m 

それとも、続けて新しいリストを構築することにより、これを行うことができますあなたが必要な項目:どちらの場合も

m = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
res = [] 
for idx, elt in enumerate(m): 
    if idx not in range(4, 10): 
     res.append(elt) 
m = res 

m 

、出力は次のとおりです。

[0, 1, 2, 3] 
0

Y

m=[0,1,2,3,4,5,6,7,8,9] 
for i in range(4,10,1): 
    m.remove(i) 

print(m) 

[0, 1, 2, 3] 
関連する問題