如何以字典的形式获得对角线列表,其中键表示第一项的索引?

时间:2016-03-01 22:59:50

标签: python

我正在建造奥赛罗游戏,董事会看起来像这样:

1.0 - value

我的逻辑的一部分围绕一个函数返回一个字典,其值为对角线列表,而键元组包含两个数字;列表中第一项的索引。所以例如下面板的左对角线看起来像这样:

L= [['.','.','.','.'],
   ['.','B','W','.'],
   ['.','W','B','.'],
   ['.','.','.','.']]

我使用以下代码

完成了这项工作
{(0, 1): ['.', '.'], (1, 3): ['.', 'B', '.'], (2, 3): ['.', '.'], (3, 3): ['.'], (0, 3): ['.', 'W', 'W', '.'], (0, 2): ['.', 'B', '.'], (0, 0): ['.']}

我想要做的是实现一个类似的功能,只对光盘做同样的事情,我正在寻找的输出是这样的:

def get_Rightdiagonally_adjacent(Li,ir,ic):
     L = []
     for i in range(max(len(Li),len(Li[0]))):
     try:
         L.append(Li[ir+i][ic+i])
    except:
        return L
    return L

def get_Leftdiagonally_adjacent(Li,ir,ic):
    L = []
    for i in range(max(len(Li),len(Li[0]))):
        if ic - i < 0:
            return L
        try:
            L.append(Li[ir+i][ic-i])
        except:
            return L
    return L


def get_Leftdiagonals(M: "2D list") -> list:
    Ld = {}
    for i in range(1,len(M)):
        Ld[(i,len(M[0])-1)] = get_Leftdiagonally_adjacent(M,i,len(M[0])-1)
    for i in range(len(M[0])):
        Ld[0,i] = get_Leftdiagonally_adjacent(M,0,i)

    return Ld

def get_Rightdiagonals(M: "2D list") -> list:
    Ld = {}
    for i in range(len(M[0])):
        Ld[(0,i)] = get_Rightdiagonally_adjacent(M,0,i)
    for i in range(1,len(M)):
        Ld[(i,0)] = get_Rightdiagonally_adjacent(M,i,0)
    return Ld

get_Leftdiagonals(L)

请注意元组如何表示列表中第一个项目相对于原始板的索引。在尝试了几天之后,我已经失败了,任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

你说你不能删除空字符串而不搞乱索引。您可以采用的一种方法是将偏移量与每个值一起存储,以便保留索引。例如:

def get_Rightdiagonally_discs(Li,ir,ic):
    # Get the unstripped diagonal
    L = get_Rightdiagonally_adjacent(Li, ir, ic)
    # Return pairs of the offset from ir/ic and value for locations with discs only
    return [(i, disc) for i, disc in enumerate(L) if disc != '.']

因此,原始代码的右对角线从(3,3)开始,值为['.', 'W', 'W', '.'],这与偏移成对,然后剥离'.' s,返回[(1, 'W'), (2, 'W')],这限制了您带有光盘的元素并识别它们的偏移量,这样您就可以获得有关它们沿对角线落下的完整信息。那会有用吗?