2017-12-28 23 views
-1

関数がリストと整数を受け取り、nの整数を取り、インデックスがiの場合はすべてのすべての要素を削除します。ここで私が作ってみたものです:インデックスが条件を満たすすべての要素を削除します。リスト割り当てインデックスが範囲外です

def f(lst, n): 
    for i in range(len(lst)): 
     if (i+1)%n==0: 
      del lst[i] 

しかし、それは私に、このエラーを与える:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "pop.py", line 4, in f 
    del lst[i] 
IndexError: list assignment index out of range 

範囲外で実行することができていないようですiインデックスポインタ?これが起こる原因は何ですか?

+0

明快さとテストのためのデータ例を示してください。 –

+1

[反復中にリストからアイテムを削除する]の可能な複製(https://stackoverflow.com/questions/1207406/remove-items-from-a-list- while-iterating) – abccd

+0

アイテムを削除するとどうなるか考えてみましょうリストから。このリストの長さが変わります。 –

答えて

2

どのデータセットを使用していますか? データセット内の数字によっては、リストからオブジェクトを削除していて、リスト内の特定のインデックスを尋ねたときに競合が発生するという問題があります。

ex_list = [2, 5, 12] 
print range(len(ex_list)) 

output [0, 1, 2] 

したがって、最初の項目がテストに合格しないと、削除されます。今oyurリストは、次のようになります。最終的に

ex_list[1] 
>>>12 

と::

ex_list[2] 
>>>IndexError: list assignment index out of range 
1

は何ですか

ex_list 
>>>[5, 12] 

問題は、あなたの中に私の次のあなたのループのために今1もよいが、ということですリストから要素を削除するときに、リストのサイズが変化しているということが起こります。

nで割り切れるインデックスを見つけるためにリストを反復処理する必要はありません。
などです。 list_length = 8およびn = 2の場合、要素#[2,4,6,8] = index [1,3,5,7]を削除する必要があることがわかります。あなたはちょうどここにフィルタを作成することができますか、このようなリストの内包も

new_list = [old_list[i] for i in range(len(old_list_length)) if (i+1) % n == 0] 
old_list = new_list 

をDO-ます: - あなたは、要素が削除されたリスト、イテレートの点に注意してくださいすることができ、オリジナルの要素ので、あなたがしたいです削除、異なるインデックスを持つようになります。答えの最初の例では、 - は、element#2(index = 1)を削除したと言います。次にelement#4,#8element #3, #7になります。これで、リストを削除する元の要素を追跡することができなくなりました。

関連する問題