2016-07-19 7 views
0

リストをループしながら編集するのは安全ですか?私のようなforループを実行しようとしていた

a = [1,2,3,4,5,6,7] 
for i in range(0, len(a), 1): 
    if a[i] == 4: 
     a.remove(a[i]) 

リストのlengthが短くなるが、イテレータiが気付いていないので、私はindex errorを持ってしまいます。

私の質問は、どのようにコード化することができますか?現在の配列条件に基づいて、ループの各繰り返しでのiを更新できますか?

+1

長さが変化し続ける場合、ループはかなり予測できません。それはどこで止まるでしょうか? –

+1

なぜそれをしたいですか?長さが 'range'関数で動的に計算された場合、無限ループに陥るでしょう。 – activatedgeek

+1

あなたのこのループが機能したとしても、それは永遠に実行されます。 –

答えて

0

あなたはそれと一緒に行くされている場合、私は知りませんが、これは、私はあなたが望む信じて何をするだろう:

i=0 
a = [1,2,3,4,5,6,7] 
while boolean_should_i_stop_the_loop : 
    if i>=len(a) : 
     boolean_should_i_stop_the_loop = False 
    #here goes what you want to do in the for loop 
    print i; 
    a.append(4) 
    i += 1 
1

あなたはそれを反復しながら、あなたのリストから要素を削除したい場合は、リストの内包表記を使用する必要があります。

a = [1,2,3,4,5,6,7] 
a = [x for x in a if not check(x)] 

リストに要素を保持するかどうかを返す「チェック」関数を記述する必要があります。

+0

ありがとう、それを変更しました。 – user2393256

2

の場合、たとえば、リスト内包表記を使用して2番目のリストを作成したり、元のリストを修正したりすることもできます。これと同じように:user2393256は、より一般的にそれを置くとして

alist = [1, 2, 3, 4, 1, 2, 3, 5, 5, 4, 2] 

alist = [x for x in alist if x != 4] 
print(alist) 
#[1, 2, 3, 1, 2, 3, 5, 5, 2] 

、あなたはそれに実装するいくつかのチェックに基づいてbooleanを返す関数my_filter()を一般と定義することができます。そして、あなたが行うことができます。

def my_filter(a_value): 
    return True if a_value != 4 else False 

alist = [x for x in alist if my_filter(x)] 

チェックはリストの内包を入力するにはあまりにも複雑だった場合、私はとても主に読みやすくするために、機能液で行くだろう。したがって、上記の例は、チェックが非常に簡単なのでベストではありませんが、私はちょうどそれが行われる方法をあなたに示したいと思っていました。

+0

誰かが本当に尋ねることを反映するために元の質問を編集する必要があります。今、誰かがコメントを読まない限り、これは全く別の答えのようです。 –

+0

@Jim私は何を拡張できるのか分かりませんが、私はそれを伸ばしたと確信しています。見てみましょう.. –

+0

さて、私はいくつかの改良を加えて編集を受け入れました。もし誰かがこれがストレッチだと思うなら、ロールバックすることができます。 –

関連する問題