获取二维列表列中非空项的距离

问题描述 投票:0回答:1

我正在尝试制作一款拼字游戏。我有一个董事会,定义如下。

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"

请帮忙。非常感谢!

python python-3.x multidimensional-array distance
1个回答
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)。

© www.soinside.com 2019 - 2024. All rights reserved.