2017-03-09 12 views
1

forループ内のifステートメントをすべて短縮するにはどうすればよいですか?私は大学のプロジェクトのためにこれを開発しています。私は方法を考えることができません。多くのif文を短くするにはどうすればよいですか? (Python 3.x)

基本的には、ボード上の特定の場所が岩石と等しくない場合は、プラントとして設定する必要があります。場所は植物の周りの円です。例:

N N N
N P N
N N N

if RainFall == 2: 
    print("This summer has been a perfect summer, the plants have multiplied.") 
    for Row in range(FIELDLENGTH): 
     for Column in range(FIELDWIDTH): 
      if Field[Row][Column] == PLANT: 
       if Field[Row + 1][Column] != ROCKS: 
        Field[Row + 1][Column] = GOODSUMMER 
       if Field[Row - 1][Column] != ROCKS: 
        Field[Row - 1][Column] = GOODSUMMER 
       if Field[Row + 1][Column + 1] != ROCKS: 
        Field[Row + 1][Column + 1] = GOODSUMMER 
       if Field[Row - 1][Column - 1] != ROCKS: 
        Field[Row - 1][Column - 1] = GOODSUMMER 
       if Field[Row][Column + 1] != ROCKS: 
        Field[Row][Column + 1] = GOODSUMMER 
       if Field[Row][Column - 1] != ROCKS: 
        Field[Row][Column - 1] = GOODSUMMER 
       if Field[Row + 1][Column + 1] != ROCKS: 
        Field[Row + 1][Column - 1] = GOODSUMMER 
       if Field[Row - 1][Column + 1] != ROCKS: 
        Field[Row - 1][Column + 1] = GOODSUMMER 
       break 
+1

たくさんの方法。しかし、それを後で開発するのに役立つ方法で一般化したいのです。 1つのアイデアは、正方形を評価し、その周囲のすべての正方形に対して一度呼び出す方法を持つことです。このようなものは、オブジェクト指向プログラミングを求めています。 –

+0

私はPythonの人ではありませんが、OOPではそのような状況のためのコマンドパターンがあります。掘り起こした後:http://stackoverflow.com/a/1494532/5058677 – Rumid

答えて

2

うん、リストにあなたのインデックス順列を入れて、その上で繰り返します。あなたは明示的にリストを定義することができます(初心者の方が読みやすくなりますが、エラーが発生しやすくなります)。最初の明示的なバージョン:

coord_shift = [(1, 0), (-1, 0), (1, 1), (-1, -1), (0, 1), (0, -1), (1, -1), (-1, 1)] 
for Row in range(FIELDLENGTH): 
    for Column in range(FIELDWIDTH): 
     if Field[Row][Column] == PLANT: 
      for i, j in coord_shift: 
       if Field[Row + i][Column + j] != ROCKS: 
        Field[Row + i][Column + j] = GOODSUMMER 

いくつかの追加の注意事項:

推奨Pythonのスタイルは、大文字のみんながそれ以上のクラスのために意図されている、通常の変数のための小文字の変数名を使用することです。

あなたは休憩する必要はありません。

上記はあなたの小さな間違いであるField[Row +1][Column -1]です。

私は約束した冒険のバージョンは次のとおりです。

coord_shift = [(i, j) for i in range(-1, 2) for j in range (-1, 2)] 
coord_shift.drop((0, 0)) 
1

私たちは、あなたのコードの残りの部分について推測することができますが、その下にある下含まテスト目的のための完全な実装です。再加工されたコードを確認するには、multiply_plants機能をチェックしてください。多くの文を持つ代わりに、ループを使用してセルの周囲の領域をチェックします。 IndexError例外が発生しないように、各リストの境界を正しくチェックしていることに気付くかもしれません。

#! /usr/bin/env python3 
import random 


FIELD_ROWS = 10 
FIELD_COLUMNS = 10 
EMPTY = ' ' 
PLANT = 'P' 
ROCKS = 'R' 
NEW_PLANT = 'N' 


def main(): 
    field = create_field() 
    show_field(field) 
    multiply_plants(field, 2) 
    replace_cells(field, NEW_PLANT, PLANT) 
    show_field(field) 


def create_field(): 
    field = [] 
    for _ in range(FIELD_ROWS): 
     row = [] 
     for _ in range(FIELD_COLUMNS): 
      row.append(random.choice([EMPTY] * 3 + [ROCKS] * 2 + [PLANT] * 1)) 
     field.append(row) 
    return field 


def show_field(field): 
    width = max(map(len, field)) * 2 + 1 
    print(f'/{"-" * width}\\') 
    print('\n'.join(' '.join(['|'] + row + ['|']) for row in field)) 
    print(f'\\{"-" * width}/') 


def multiply_plants(field, rainfall): 
    # If there was enough rain, cause the plants to spread. 
    if rainfall > 1: 
     print('This summer has been a perfect summer;') 
     print('the plants have multiplied!') 
     # Find each space that already has a plant in it. 
     for y, row in enumerate(field): 
      for x, cell in enumerate(row): 
       if cell == PLANT: 
        # Introduce a Y-axis offset to search up & down. 
        for y_offset in range(-1, 2): 
         y_index = y_offset + y 
         if 0 <= y_index < len(field): 
          # Introduce a X-axis offset to search left & right. 
          for x_offset in range(-1, 2): 
           if y_offset or x_offset: # Skip zero offset. 
            x_index = x_offset + x 
            if 0 <= x_index < len(field[y_index]): 
             # Spread plant to non-rock areas. 
             if field[y_index][x_index] != ROCKS: 
              field[y_index][x_index] = NEW_PLANT 


def replace_cells(field, old, new): 
    for y, row in enumerate(field): 
     for x, cell in enumerate(row): 
      if cell == old: 
       field[y][x] = new 


if __name__ == '__main__': 
    main() 
関連する問題