2016-11-01 5 views
0

リスト全体で値を移動できる場合は、ブール値を返す必要があります。 '。'文字列が移動できる空の場所です。第1のfuncでは、どのように同じ値を左右どちらにシフトするのですか?私は左と右の変数をどのように定義するのか分かりませんし、変数を移動している場所を削除するためにpop()が必要かどうか疑問に思っていました。私はその意志だけで動く第二関数を記述することを計画し機能:リスト内の異なる方向にアイテムをシフトしますか?

area1 = [['.', '.', '.', 'e'], 
     ['.', 'A', 'A', 'e'], 
     ['.', 'X', '.', 'e'], 
     ['.', 'X', 'Y', 'Y'], 
     ['.', '.', 'Z', 'Z']] 

:リストは、(私は実際には、単に視覚的な参照リストを返す必要はありません)した後のようになりますどのように

area1 = [['.', '.', '.', 'e'], 
     ['A', 'A', '.', 'e'], 
     ['.', 'X', '.', 'e'], 
     ['.', 'X', 'Y', 'Y'], 
     ['.', '.', 'Z', 'Z']] 

def shift_horizontal(value, direction, area): 
    for i in range(len(area)-1): 
     for j in range(len(row)-1): 
      if right and value[i] == '.'[i+1]: # Will shift right if value next is '.' 
       return True 
      elif left and value[i] == '.'[i-1]: # Will shift left if value next is '.' 
       return True 
      else: 
       return False 
shift_horizontal('A', right, area1) 

値をリストの上下に移動します。リスト内の変数のように上下に移動するには、上記の関数で何を変更する必要がありますか?任意のヘルプ/アドバイスをいただければ幸いです私はそれが音として退屈なようにいくつかの機能を内蔵したループとブーリアンだけで簡単にしています。

答えて

1
def shift_horizontal(value, direction, area):#direction True is left 
    result = [] 
    for lane in area: 
     if not direction: 
      lane = reversed(lane) 
     try: 
      ind = lane.index(value) 
      result.append('.' in lane[:index]) 
     except ValueError: 
      result.append(False) 
    return result 

ブール値のリストを返します。方向に応じてリストを反転します。次に、一番左のインデックスvalueを探します。その時点までリストを確認して'.'を確認してください。これがまさにあなたが望むものなのかどうかは分かりません。隣にあるかどうかを確認したい場合はif lane[index-1] == '.'を代わりに

+0

閉じる私は必要なものを、しかしとValueErrorを廃止し、機能を試してみてくださいする方法はありますか?私は文字列 'A'の長さを取得し、結果のリストを取得するためにリストを変更するには、それを繰り返しながら言及した。 –

+0

文字であることが保証されている場合は、 'ind =( '' .join(lane))を実行できます。find(value)'これはインデックスを返します。 –

0

左と右の代わりに-1 & +1を使用してください。
すべての 'A'を1回実行する:
方向が+1(右)の場合は、内側のリストを右から左に繰り返し、遭遇したときにすべての「A」を移動して、その行
方向が-1(左)の場合は、左から右に反復します。

area1 = [['.', '.', '.', 'e'], 
     ['A', 'A', '.', 'e'], 
     ['.', 'X', '.', 'e'], 
     ['.', 'X', 'Y', 'Y'], 
     ['.', '.', 'Z', 'Z']] 

def move_horizontal(table, value, direction): 
    is_anything_moved = False 
    for row in table: 
     width = len(row) 
     # Traverse the row (skipping the first element) from right to left if direction is 1. 
     for x in (range(1,width,1) if direction==-1 else range(width-2,-1,-1)): 
      if row[x]==value: #found a value match, now move it as far as we can 
       i = x+direction # new index of value 
       while i<width and i>=0 and row[i]=='.': 
        row[i-direction] = '.' 
        row[i] = value 
        i += direction 
        is_anything_moved = True 
    return is_anything_moved 

[print(row) for row in area1] 
print() 

move_horizontal(area1,'A',1) 

[print(row) for row in area1] 
print() 

move_horizontal(area1,'e',-1) 

[print(row) for row in area1] 

これは、出力すべきである:

['.', '.', '.', 'e'] 
['A', 'A', '.', 'e'] 
['.', 'X', '.', 'e'] 
['.', 'X', 'Y', 'Y'] 
['.', '.', 'Z', 'Z'] 

['.', '.', '.', 'e'] 
['.', 'A', 'A', 'e'] 
['.', 'X', '.', 'e'] 
['.', 'X', 'Y', 'Y'] 
['.', '.', 'Z', 'Z'] 

['e', '.', '.', '.'] 
['.', 'A', 'A', 'e'] 
['.', 'X', 'e', '.'] 
['.', 'X', 'Y', 'Y'] 
['.', '.', 'Z', 'Z'] 
関連する問題