2016-10-16 48 views
0

我正在嘗試製作拼字遊戲。我有一個董事會,定義如下。在二維列表列中獲取非空項目的距離

self.board = [[" ", "A ", "B ", "C ", "D ", "E ", "F ", "G ", "H ", "I ", "J ", "K ", "L ", "M ", "N ", "O "], 
    ['01', 'TWS', ' ', ' ', 'DLS', ' ', ' ', ' ', 'TWS', ' ', ' ', ' ', 'DLS', ' ', ' ', 'TWS'], 
    ['02', ' ', 'DWS', ' ', ' ', ' ', 'TLS', ' ', ' ', ' ', 'TLS', ' ', ' ', ' ', 'DWS', ' '], 
    ['03', ' ', ' ', 'DWS', ' ', ' ', ' ', 'DLS', ' ', 'DLS', ' ', ' ', ' ', 'DWS', ' ', ' '], 
    ['04', 'DLS', ' ', ' ', 'DWS', ' ', ' ', ' ', 'DLS', ' ', ' ', ' ', 'DWS', ' ', ' ', 'DLS'], 
    ['05', ' ', ' ', ' ', ' ', 'DWS', ' ', ' ', ' ', ' ', ' ', 'DWS', ' ', ' ', ' ', ' '], 
    ['06', ' ', 'TLS', ' ', ' ', ' ', 'TLS', ' ', ' ', ' ', 'TLS', ' ', ' ', ' ', 'TLS', ' '], 
    ['07', ' ', ' ', 'DLS', ' ', ' ', ' ', 'DLS', ' ', 'DLS', ' ', ' ', ' ', 'DLS', ' ', ' '], 
    ['08', 'TWS', ' ', ' ', 'DLS', ' ', ' ', ' ', 'B', 'O', 'G', ' ', 'DLS', ' ', ' ', 'TWS'], 
    ['09', ' ', ' ', 'DLS', ' ', ' ', ' ', 'DLS', ' ', 'DLS', ' ', ' ', ' ', 'DLS', ' ', ' '], 
    ['10', ' ', 'TLS', ' ', ' ', ' ', 'TLS', ' ', ' ', ' ', 'TLS', ' ', ' ', ' ', 'TLS', ' '], 
    ['11', ' ', ' ', ' ', ' ', 'DWS', ' ', ' ', ' ', ' ', ' ', 'DWS', ' ', ' ', ' ', ' '], 
    ['12', 'DLS', ' ', ' ', 'DWS', ' ', ' ', ' ', 'DLS', ' ', ' ', ' ', 'DWS', ' ', ' ', 'DLS'], 
    ['13', ' ', ' ', 'DWS', ' ', ' ', ' ', 'DLS', ' ', 'DLS', ' ', ' ', ' ', 'DWS', ' ', ' '], 
    ['14', ' ', 'DWS', ' ', ' ', ' ', 'TLS', ' ', ' ', ' ', 'TLS', ' ', ' ', ' ', 'DWS', ' '], 
    ['15', 'TWS', ' ', ' ', 'DLS', ' ', ' ', ' ', 'TWS', ' ', ' ', ' ', 'DLS', ' ', ' ', 'TWS']]   

我的目標是找到距離任何字母最近的字母的距離。例如,如果我叫B上的功能,它將返回

{"up" : 7, "down" : 7, "left" : 7, "right" : 0} 

我已經實驗過了內置next功能,但我想我的問題是,有一個簡單的方法來獲得的列二維列表?

我也有這應被視爲空的事情的清單:

emptyList = "TWS", "DWS", "TLS", "DLS" 

請幫助。非常感謝!

回答

1

你可以使用next,並與[row[col_num] for row in board]這樣提取柱:

def distances(row_num, col_num): 
    letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 
    if not col_num.isdigit(): 
     col_num = ord(col_num.upper()) - ord('A') + 1 
    col = [row[col_num] for row in board] 
    row = board[row_num] 
    return { 
     'right': next((i for i, c in enumerate(row[col_num+1:]) if c in letters), 15-col_num), 
     'left': next((i for i, c in enumerate(row[col_num-1:0:-1]) if c in letters), col_num-1), 
     'down': next((i for i, c in enumerate(col[row_num+1:]) if c in letters), 15-row_num), 
     'up': next((i for i, c in enumerate(col[row_num-1:0:-1]) if c in letters), row_num-1) 
    } 

print (distances(8, 'H')) 

該函數的自變量應該是行號(8)和列數(8)或相應的字母H

要檢查方塊是否爲空,函數將檢查內容是否不是單個字母(A-Z)。

看到它運行repl.it

+0

非常感謝!這幫了大忙! – rassar