2016-07-18 5 views
0

多次元配列を反復して要素のインデックスを返すのに問題があります。私がやっているのは、多次元配列を移動するMoveUp関数を作成することです。MultiDimensional Arrayのアイテムのインデックスを返し、それらのアイテムの属性をチェックする方法

現在、私のfindメソッドは、多次元配列の最初のインデックス内の最初の配列のオブジェクトの正しいインデックスを返します。多次元配列外の残りのアイテムはエラーを返します:

UnboundLocalError: 'local variable 'column' refrenced before assignment' 

また、MoveUp関数ではエラーが発生します。フィールド配列の1つの項目を「アクティブ」に設定し、それを配列内で上に移動する開始点にします。しかし何らかの理由で私のコードが私にこのエラーを与えます。

AttributeError: 'list' object has no attribute 'status' 


    class Square:  
    def SetName(self, name): 
     self.name = name 

    def SetOwner(self,name): 
     self.controlled_by = name 

    def SetLED(self, name): 
     self.led = name 

    def SetPosition(self, position): 
     self.posiion = position 

    def SetStatus(self, status): 
       self.status = status 

B1_A = Square() 
B1_A.SetName("B_R1_A") 
B1_A.SetOwner("Open") 
B1_A.SetLED("Off") 
B1_A.SetStatus("UnActive") 

B1_B = Square() 
B1_B.SetName("B_R1_B") 
B1_B.SetOwner("Open") 
B1_B.SetLED("Off") 
B1_B.SetStatus("UnActive") 

B2_A = Square() 
B2_A.SetName("B_R2_A") 
B2_A.SetOwner("Open") 
B2_A.SetLED("Off") 
B2_A.SetStatus("UnActive") 

B2_B = Square() 
B2_B.SetName("R_R2_B") 
B2_B.SetOwner("Open") 
B2_B.SetLED("Off") 
B2_B.SetStatus("UnActive") 

B3_A = Square() 
B3_A.SetName("R_R3_A") 
B3_A.SetOwner("Open") 
B3_A.SetLED("Off") 
B3_A.SetStatus("UnActive") 

R1_A = Square() 
R1_A.SetName("R_R1_A") 
R1_A.SetOwner("Open") 
R1_A.SetLED("Off") 
R1_A.SetStatus("UnActive") 

R1_B = Square() 
R1_B.SetName("R_R1_B") 
R1_B.SetOwner("Open") 
R1_B.SetLED("Off") 
R1_B.SetStatus("UnActive") 

R2_A = Square() 
R2_A.SetName("R_R2_A") 
R2_A.SetOwner("Open") 
R2_A.SetLED("Off") 
R2_A.SetStatus("UnActive") 

R2_B = Square() 
R2_B.SetName("R_R2_B") 
R2_B.SetOwner("Open") 
R2_B.SetLED("Off") 
R2_B.SetStatus("UnActive") 

R3_A = Square() 
R3_A.SetName("R_R3_A") 
R3_A.SetOwner("Open") 
R3_A.SetLED("Off") 
R3_A.SetStatus("UnActive") 

# MultiDimensional Array 
Field = [[B1_A,B1_B],[B2_A,B2_B],[B3_A],[R3_A],[R2_A,R2_B],[R1_A,R1_B]] 

#Find Index of Element in MultiDimenstional Array 
def find(l, elem): 
    for row, i in enumerate(l): 
     try: 
      column = i.index(elem) 
      return row, column 
     except ValueError: 
       return row, column 
     return -1 

print(find(Field, B1_A)) #Returns (0,0) Correct 
print(find(Field, B1_B)) #Returns (0,1) Correct 
#print(find(Field, B2_B)) #Throws Error 

# Set a Square Status Active 
B1_B.status ="Active" 

def MoveUp(): 
     #Iterate through each item in Field 
     for i in Field: 
       #if item status equal to Active 
       if i.status == "Active": 
         #if item index 3 item in the multidimensional array 
         if find(Field, i) == (2,0): 
         #current position is this index 
          current_position = (find(Field, i)) 
          print(current_position) 
          #new position is this index + 1 
          new_position = current_position + 1 
          #old position if new position - 1 
          old_position = new_position - 1 
          #Set the servos status in the new postion to Active 
          Field(new_position).status = "Active" 
          #Set the servos status in the old position to UnActive 
          Field(old_position).status = "UnActive" 

         else: 
          #current position is this index 
          current_position = (find(Field, i)) 
          #new position is this index + 2 
          new_position = current_position + 2 
          #old position if new position - 2 
          old_position = new_position - 2 
          #Set the servos status in the new postion to Active 
          Field(new_position).status = "Active" 
          #Set the servos status in the old position to UnActive 
          Field(old_position).status = "UnActive" 

MoveUp() 

答えて

0

存在しない値を返すために最初にエラーが発生しました。

#Find Index of Element in MultiDimenstional Array 
def find(l, elem): 
    for row, i in enumerate(l): 
     try: 
      column = i.index(elem) 
      return row, column 
     except ValueError: 
      #here is error column not exists. 
      #return row, column 
      pass  

      #becouse it's normal that one of array don't have needed item 
      #you should pass 


    return -1 

print(find(Field, B1_A)) #Returns (0,0) Correct 
print(find(Field, B1_B)) #Returns (0,1) Correct 
print(find(Field, B2_B)) #will Return (1,1) 

2dアレイを1dとして使用しようとしたために2番目のエラーがあります。

def MoveUp(): 

    #Iterate through each item in Field 
    for SubFields in Field: 
     #Every Field item is Array of Fields 
     #ie [B1_A,B1_B] You need to iterator over this sub field. 
     for i in SubFields: 
      #if item status equal to Active 

      if i.status == "Active": 
       #if item index 3 item in the multidimensional array 
       if find(Field, i) == (2,0): 
        #current position is this index 
        current_position = (find(Field, i)) 
        print(current_position) 
        #new position is this index + 1 

        # here is another error, but you will not get it with you test data 
        #current_position is tuple (2, 0) 
        #you can't add 1 to tuple 
        #I don't know what you trying to do here, so can't help with it. 
        new_position = current_position + 1 #ERROR!!! 
        #old position if new position - 1 
        old_position = new_position - 1 
        #Set the servos status in the new postion to Active 
        Field(new_position).status = "Active" #also error Field is array not function 
        #Set the servos status in the old position to UnActive 
        Field(old_position).status = "UnActive" 

       else: 
        #current position is this index 
        current_position = (find(Field, i)) 

UPDATE:

#really crazy multidimensional array 
Field = [ [ B1_A ], 
      [ 
       [ [B1_B], 
       [[B2_A]] ], 
       [ [B2_B, B3_A] ] 
      ], 
      [[ [ [[R3_A]] ], 
      [ [[R2_A],[R2_B]] ] ]] ] 

def find(l, needle): 
    """Search for needle in l. 
     If found returns path to needle, otherwise return empty array""" 

    def find_path(l, needle): 
     """Search for needle in l. 
      If found returns reversed path to needle, otherwise return empty array""" 
     for index, item in enumerate(l): 
      if type(item) is list: 
       sub_path = find_path(item, needle) 
       if sub_path: 
        sub_path.append(index) 
        return sub_path 
      elif item == needle: 
       return [ index ] 

     return [] 


    path = find_path(l, needle) 
    path.reverse() 
    return path 

def get_by_path(l, path): 
    """Get element of list l by it's path. 
     If path is incorrect throw IndexError""" 
    item = l 
    for i in path: 
     item = item[i] 
    return item 

print(find(Field, B3_A)) # print [1, 1, 0, 1] 
print(get_by_path(Field, find(Field, B3_A)).name) #print R_R3_A 

print(find(Field, R2_B)) # print [2, 0, 1, 0, 1, 0] 
print(get_by_path(Field, [2, 0, 1, 0, 1, 0]).name) #print R_R2_B 
+0

更新:多次元リスト内の項目を検索し、検索することができる追加機能あなたが見つける(および取得)したい場合は任意の深さを持つ配列内のアイテムはこれを試します – Arnial

関連する問題