Skip to main content
 首页 » 编程设计

检查嵌套列表中对角线的 Pythonic 方法

2025年05月04日15dyllove98

我有一个 0 和 1 的嵌套列表,例如:

L = [[1, 0, 1], 
     [0, 0, 0], 
     [0, 0, 1]] 

我想检查是否有任何对角线。嵌套列表可以有任何大小,只要子列表的长度等于整个列表的长度(它是一个正方形)。因此,如果我在上面的列表中运行它,它会返回 False,因为两个是对角线。

我当前的代码是:

for num, i in enumerate(List): 
    for count, m in enumerate(i): 
        key1 = True 
        key2 = True 
        key3 = True 
        key4 = True 
        num1 = num 
        num2 = num 
        num3 = num 
        num4 = num 
        count1 = count 
        count2 = count 
        count3 = count 
        count4 = count 
        if m == 1: 
            while key1 or key2 or key3 or key4: 
            #print(key1, key2, key3, key4) 
                try: 
                    if List[num1 + 1][count1 + 1] == 1: 
                        print(List[num1 + 1][count1 + 1]) 
                        return False 
                    num1 += 1 
                    count1 += 1 
                except IndexError: 
                    key1 = False 
                try: 
                    if List[num2 - 1][count2 + 1] == 1: 
                        if num2 > 0: 
                            print(List[num2 - 1][count2 + 1]) 
                            return False 
                    num2 -= 1 
                    count2 += 1 
                except IndexError: 
                        key2 = False 
                try: 
                    if List[num3 + 1][count3 - 1] == 1: 
                        if count3 > 0: 
                            print(List[num3 + 1][count3 - 1]) 
                            print(num3 + 1, count3 - 1) 
                            return False 
                    num3 += 1 
                    count3 -= 1 
                except IndexError: 
                    key3 = False 
                try: 
                    if List[num4 - 1][count4 - 1] == 1: 
                        if count4 > 0 and num4 > 0: 
                            print(List[num4 - 1][count4 - 1]) 
                            return False 
                    num4 -= 1 
                    count4 -=1 
                except IndexError: 
                    key4 = False 
return True 

代码扫描列表 1 秒,当找到一个时,它查看它的四个角并搜索它们。它继续向拐角的方向搜索,一次移动一格。如果找到另一个 1,则返回 false。一旦搜索了所有可能的对角线网格(直到返回索引错误),代码就会移动到找到的下一个 1。一旦搜索了每个 1 并且没有找到任何对角线,代码将返回 true。

感觉笨重且效率低下,但我不确定如何压缩它。有更短的方法吗?

请您参考如下方法:

您可以像这样访问对角线:

L = [[1, 0, 1], 
 [0, 0, 0], 
 [0, 0, 1]] 
 
diag1 = [L[i][i] for i in range(len(L))] 
diag2 = [L[i][len(L[0])-i-1] for i in range(len(L))] 
if diag1 == diag2: 
   pass #do something here