2017-02-21 18 views
1

機能fは不必要な繰り返しを行います。条件付きのPythonループ

def f(array): 
    for (i, row) in enumerate(array): 
     for (j, value) in enumerate(row): 
      if i < some_number and j > some_other_number: 
       do_something 

forループ内の条件を強制する慣用的な方法はありますか?

def f(array): 
    for (i < some_number, row) in enumerate(array): 
     for (j > some_other_number, value) in enumerate(row): 
      do_something 
+1

は、同じ繰り返しがi'はいつもここに役に立つかもしれない 'break'が増加している'しかし –

+0

を行うことでしょう。 – BallpointBen

+0

なぜwhileループを使用しないのですか? – rassar

答えて

3

を試みることができるstartパラメータを持っている:あなたは、あなたの計算でijを必要としないが与えられ

from itertools import islice 

def f(array): 
    for (i, row) in islice(enumerate(array),some_number): 
     for (j, value) in islice(enumerate(row),some_other_number+1,None): 
      # do_something 
      pass

(あなただけそれらを必要境界チェックの場合は省略することもできます)。これが可能であったとしても

from itertools import islice 

def f(array): 
    for row in islice(array,some_number): 
     for value in islice(row,some_other_number+1,None): 
      # do_something 
      pass 
3

さて、あなたは常にrangeを使用することができます。

def f(array): 
    for i in range(some_number, len(array)): 
     row = array[i] 
     for j in range(some_other_number, len(row)): 
      value = row[j] 
      # do_something 

some_numbervalueに依存しないrowsome_other_numberに依存しないことを条件とします。それ以外の場合、本当に何もできません。

arrayrowの両方のオブジェクトが__getelement__をサポートする必要があることに注意してください(例:両方が実際のリストの場合)。発電機では機能しません。

+0

これは 'array'と' row'が '__getelement__'をサポートしている場合にのみ有効です。しかし、発電機などはありませんが、+1(おそらく言及する価値はあります)。 –

+0

@WillemVanOnsem True。 – freakish

1

この条件をインラインにすることはできませんが、内側ループが入力されないようにすることはできます。

def f(array): 
    for (i, row) in enumerate(array): 
     if i < some_number: 
      for (j, value) in enumerate(row): 
       j > some_other_number: 
        do_something 

enumerateあなたはあなたがそのためにitertools.islice(iterable,start,stop[,step])を使用することができます