2015-03-21 4 views
1

У меня есть следующие:Есть ли способ предотвратить обертывание индексов?

# Possible neighbors as tuples 
UP = (-1,0) 
DOWN = (1,0) 
LEFT = (0,-1) 
RIGHT = (0,1) 
POTENTIAL_NEIGHBORS = (UP, DOWN, LEFT, RIGHT) 

def LocateNeighbors(self): 
     print '\nWorking on: {}:{}'.format(self.index,self.value) 
     for n in POTENTIAL_NEIGHBORS: 
      try: 
       if theBoard[self.index[0]+n[0]][self.index[1]+n[1]]: 
        print "Adding neighbor: " + theBoard[self.index[0]+n[0]][self.index[1]+n[1]] 
        self.neighbors.append(n) 
      except IndexError: 
       print 'failed on: {}'.format(n) 

.. где self является клетка в игровом поле, такие как:

 A  B  C  D  E  F 
1 | {66} | {76} | {28} | {66} | {11} | {09} 
------------------------------------------- 
2 | {31} | {39} | {50} | {08} | {33} | {14} 
------------------------------------------- 
3 | {80} | {76} | {39} | {59} | {02} | {48} 
------------------------------------------- 
4 | {50} | {73} | {43} | {03} | {13} | {03} 
------------------------------------------- 
5 | {99} | {45} | {72} | {87} | {49} | {04} 
------------------------------------------- 
6 | {80} | {63} | {92} | {28} | {61} | {53} 
------------------------------------------- 

Однако, это выход я получаю для первой ячейки я нахожусь проверка (0,0):

Working on: (0, 0):66 
Adding neighbor: 80 
Adding neighbor: 31 
Adding neighbor: 09 
Adding neighbor: 76 

по существу, если индекс (то, что я считал бы) недействительно, оно завершается до конца списка. Есть ли способ предотвратить или, по крайней мере, обнаружить это поведение? Или, может быть, более элегантный способ сделать это?

ответ

2

Добавить проверку по линии:

if (0 <= (self.index[0] + n[0]) < num_cols) and 
    (0 <= (self.index[1] + n[1]) < num_rows): 
    # Do stuff here 

Таким образом, вы должны, мы надеемся, также избежать IndexError, когда вы находитесь на противоположном края доски.

Edit:

ответ Дэниела более Pythonic, я думаю. Это следует принципу EAFP.

2

Вы можете использовать диапазон клетчатой-функцию:

def check(n): 
    if n<0: 
     raise IndexError(n) 
    return n 

def LocateNeighbors(self): 
    print '\nWorking on: {}:{}'.format(self.index,self.value) 
    for n in POTENTIAL_NEIGHBORS: 
     try: 
      if theBoard[check(self.index[0]+n[0])][check(self.index[1]+n[1])]: 
       print "Adding neighbor: " + theBoard[self.index[0]+n[0]][self.index[1]+n[1]] 
       self.neighbors.append(n) 
     except IndexError: 
      print 'failed on: {}'.format(n) 
Смежные вопросы