首页 > 解决方案 > 如何修复此代码?(多维)

问题描述

想象有一个棋盘。如果没有 2 个皇后(在下面的代码中用 1 表示)位于对角线,我希望我的函数返回 True。

chess = [[1, 0, 0, 0],
         [0, 0, 1, 0],
         [0, 1, 0, 0],
         [0, 0, 1, 0]]


def diagonal_check(chess):
    v = []
    z = []
    for y in range(len(chess)):
        v.append(map(lambda x: x[len(chess) - y - 1], chess[y]))
    for t in range(len(chess)):
        z.append(map(lambda x: x[t], chess[t]))

    if len(list(filter(lambda x: x == [1], v))) > 1 or len(list(filter(lambda x: x == [1], z))) > 1:
        return False
    else:
        return True

print(diagonal_check(chess))

出于某种原因,尽管上面的国际象棋对角线显示了 2 个 '1',但我的代码始终返回 True。有人可以帮我吗?总体上解决这个问题可能有更好的答案,但我想知道如何修复这个特定的代码。

仔细一看,我意识到 x[], chess[y] 部分有问题。但我不知道如何解决它。

标签: python-3.x

解决方案


一个更简单的解决方案是在这种情况下不使用 map,因为它没有帮助。

def diagonal_check(chess):
    v = []
    z = []
    for y in range(len(chess)):
        v.append(chess[y][len(chess) - y - 1])
    for t in range(len(chess)):
        z.append(chess[t][t])

    if len(list(filter(lambda x: x == 1, v))) > 1 or len(list(filter(lambda x: x == 1, z))) > 1:
        return(False)
    else:
        return(True)

map将返回一个迭代器并且不会立即评估它。因此,您需要在每个map对象上调用 next 或将其显式转换为列表。


推荐阅读