2016-10-16 23 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