2

所以我被困在这个问题上,我被要求在 Python 中编写一个函数来检查一个 n 维数组(就是他们所谓的吗?)是否“对称”,这意味着该行数组的 1 == 第 1 列,第 2 行 == 第 2 列,第 3 行 == 第 3 列,依此类推。目标是有一个函数,如果对称则返回布尔值 True,否则返回 False。

我设法编写了一个有效的函数,但它只适用于大小为完美正方形的列表(例如 2 x 2、4 x 4),并且我的一些测试用例是“不规则”大小的(例如 2 x 5、3 x 2)。对于这些列表,我最终会在此处获得列表索引超出范围错误代码:

def symmetric(square):
    final_result = []
    x = 0
    y = 0
    while x < len(square):
        row_list = []
        col_list = []
        while y < len(square[x]):
            print "(x, y): %d, %d" % (x, y)
            print "(y, x): %d, %d" % (y, x)
            row_list.append(square[x][y])
            col_list.append(square[y][x])
            y = y + 1
        if row_list == col_list:
            final_result.append(True)
        else:
            final_result.append(False)
        x = x + 1

    for x in final_result:
        if x == False:
            return False
    return True

还有我在这里失败的测试用例:

print symmetric([[1, 2, 3, 4],
                [2, 3, 4, 5],
                [3, 4, 5, 6]])
#Expected result: >>> False
#List index out of range

# This one actually returns the correct result, I'm just including it here
# for reference.
#print symmetric([["cat", "dog", "fish"],
#                ["dog", "dog", "fish"],
#                ["fish", "fish", "cat"]])
#Expected result: >>> True
#Actual result: >>> True


print symmetric([[1,2,3],
                 [2,3,1]])
#Expected Result: >>> False
#Actual result: list index out of range

有人可以帮我修改代码,使其适用于这些“不规则形状”的数组吗?

4

6 回答 6

8

这段代码将为您完成所有工作:

def symmetric(square):
    square = [tuple(row) for row in square]
    return square == zip(*square)

在您的解决方案中,您自己做了太多的工作。Python 将为您比较序列,因此更简单的方法是将正方形转置,使其行变为列,反之亦然,然后将其与原始值进行比较。

我们可以使用zip 函数转置正方形。这需要许多序列并返回一个包含每个序列的第一个的元组,然后返回一个包含每个序列的第二个的元组,依此类推。通过传递square*square我们将每一行作为一个单独的参数传递;这具有转置正方形的效果。

唯一的复杂之处是zip返回元组而不是列表,因此我们必须确保square是元组列表,以便比较有效。

于 2012-06-27T15:15:26.877 回答
2

您可以将此检查放在函数的开头:

for row in square:
    if len(row) != len(square):
        return False

或者可能更短

if not all(len(square) == len(row) for row in square): return False
于 2012-06-27T14:51:15.503 回答
1

这是主要测试的替代版本:

for i, line in enumerate(matrix):
    for j in range(len(line)):
        if a[i][j] != a[j][i]:
             return False
return True

当然,建议您测试矩阵是否为正方形的所有其他答案都成立。

于 2012-06-27T15:13:23.900 回答
0

在开头附近添加:

for row in square:
    if len(row) != len(square):
        return False
于 2012-06-27T14:54:33.930 回答
0

Python3的一个版本

def symmetric(L)
    return all(i==j for i,*j in zip(L ,*L))
于 2012-07-06T00:58:50.773 回答
0

y = 0应该在第一个 while 循环内。像这样:

def symmetric(square):
    final_result = []
    x = 0
    while x < len(square):
         y = 0
        row_list = []
        .
        .
于 2016-08-30T18:13:28.593 回答