Python - 二维数组中的对角匹配

时间:2017-12-02 02:43:50

标签: python arrays

当3个或更多元素相同时,我需要Python中的2D数组中的对角线匹配帮助。

在下面的场景中,“2”表示对角线匹配。因此,我想让它们成为“-2”,因为它们形成了匹配。

鉴于

[[0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 0], 
 [3, 1, 2, 0, 0],  # 2 at index 2
 [1, 2, 1, 0, 0],  # 2 at index 1
 [2, 3, 3, 0, 0]]  # 2 at index 0

结果

[[0,  0, 0, 0, 0],
 [0,  0, 0, 0, 0],
 [3,  1,-2, 0, 0],  # -2 now at index 2
 [1, -2, 1, 0, 0],  # -2 now at index 1
 [-2, 3, 3, 0, 0]]  # -2 now at index 0

我认为它们是对角线匹配的多个方向(从左/右),所以我想覆盖这些情况。理想情况下,我想在不导入任何模块的情况下执行此操作。

谢谢(:

1 个答案:

答案 0 :(得分:0)

这是从一开始就要做的事情,假设行的长度是相同的,你想要全长对角线:

#get diagonals, number of diagonals is 2 * additional rows, where
#multiplication by 2 is for left and right diagonal
diagonals = [[] for asymmetry in range((len(test)%len(test[0])+1)*2)]
for i, diagonal in enumerate(diagonals):
    for rowidx in range(len(test[0])):
        #if left diagonal
        if i % 2 == 0:
            diagonal.append(test[i//2+rowidx][rowidx])
        #if right diagonal
        elif i % 2 == 1:
            diagonal.append(test[i//2+rowidx][len(test[0])-rowidx-1])
#Now check for same values in diagonals
for i, diagonal in enumerate(diagonals):
    for value in set(diagonal):
        #indeces of repeating values:
        valueidx = [j for j, val in enumerate(diagonal) if val==value]
        #if value repeats and is not 0 and that they're ordered:
        if len(valueidx) > 2 and value is not 0 and all(a-1 == b for a, b in zip(valueidx[1:], valueidx[:-1])):
            for idx in valueidx:
                #case of left diagonal
                if i % 2 == 0:
                    test[i//2 + idx][idx] *=-1
                #case of right diagonal
                if i % 2 == 1:
                    test[i//2 + idx][len(test[0])-idx-1] *=-1

应该可以大量简化这段代码,但这里有一些东西可以从中开始。使用numpy会大量简化代码,使用numpy.diag和简单表达式来替换值。

test = [[0, 0, 0, 0, 0], 
        [0, 0, 0, 0, 0], 
        [3, 1, 2, 0, 0],
        [1, 2, 1, 0, 0],
        [2, 3, 3, 0, 0],
        [0, 1, 3, 0, 1]]
运行上面的脚本后

test
[[ 0, 0, 0, 0, 0],
 [ 0, 0, 0, 0, 0],
 [ 3,-1,-2, 0, 0],
 [ 1,-2,-1, 0, 0],
 [-2, 3, 3, 0, 0],
 [ 0, 1, 3, 0,-1]]