首页 > 解决方案 > 如何比较嵌套列表的元素?

问题描述

我有某种矩阵: [[1,2,3],[1,2,3],[0,2,1],[1,2,3]] 我希望能够确定如何很多时候,我有对角线、垂直和水平方向的序列 1、2、3,但我在最后两个循环中遇到索引超出范围的问题。提前感谢您的回答!!

lista = [[1,2,3],[1,2,3],[0,2,1],[1,2,3]]
compteur_horizontal = 0
for i in range(len(lista)):
    for c in range(len(lista[i])-2):
        if lista[i][c] == 1 and lista[i][c+1] == 2 and lista[i][c+2] == 3:
            compteur_horizontal += 1
            print("ok")

compteur_vertical = 0
for c in range(len(lista)):
    for j in range(len(lista[c])):
        print(lista[j][c])

compteur_diagonale = 0
for j in range(len(lista)):
    print(lista[i][i])

对于第一个计数器,我希望它是 3,因为我们有 3 次水平序列 1,2,3。对于第二个计数器,我希望它为 0,因为垂直没有 1、2、3 序列。我也在等待一个 0 的计数器,因为对角线上没有 1,2,3 序列

标签: python-3.xmultidimensional-array

解决方案


即使您更正了当前的错误,您的代码也不会工作。您需要在第二个循环中更改 j 和 c 以解决错误。

对于水平和垂直这里的代码。稍后我将添加如何计算对角线的。

#lista = [[1, 2, 3],[1, 2, 3],[0, 2, 1],[1, 2, 3]]
lista = [[1,2,2],
         [1,2,4],
         [4,2,3],
         [5,6,3]]
ptrn = [1, 2, 3]

# returns True is lst (1d array) has ptrn (1d array).
# e.g. lst[1,2,4,6,1,2,3,7], ptrn=[1,2,3] return True
# e.g. lst[1,2,4,6,1,4,3,7], ptrn=[1,2,3] return False
def is_pattern_in_a_list(lst, ptrn):
    if ptrn[0] in lst:
        idx = lst.index(ptrn[0])
        for i in range(1, len(ptrn)):
            if idx + i < len(lst):
                if ptrn[i] != lst[idx+i]:
                    return False
            else:
                return False
        return True
    else:
        return False

# counting horizontal occurances
count_h = 0
for row in lista:
    if is_pattern_in_a_list(row, ptrn):
        count_h += 1

# counting vertical occurances
# we first transpose the 2d array and use the same
# method of counting horizontal occurances.

def transpose_2d_array(a):
    return [[a[j][i] for j in range(len(a))] for i in range(len(a[0]))]

lista_transpose = transpose_2d_array(lista)

count_v = 0
for row in lista_transpose:
    if is_pattern_in_a_list(row, ptrn):
        count_v += 1

# for diagonal occurances first we need to extract the diagonals 
# with len >= len(ptrn).

# diagonals for the upper right triangle of the matrix:
count_d = 0
for i in range(len(lista[0])):
    diag = []
    j = 0
    k = i
    while j < len(lista)-i and k < len(lista[0]):
        diag.append(lista[j][k])
        j += 1
        k += 1
    if is_pattern_in_a_list(diag, ptrn):
        count_d += 1

# diagonals for the lower left triangle of the matrix
i = len(lista) - 1
while i >= 1:
    j = i
    k = 0
    diag = []
    while j < len(lista) and k <= len(lista)+1-i:
        diag.append(lista[j][k])
        j += 1
        k += 1
    i -= 1

    if is_pattern_in_a_list(diag, ptrn):
        count_d += 1

    print(diag)

print("Horizontal %d" % count_h)
print("Vertical %d" % count_v)
print("Diagonal %d" % count_d)

推荐阅读