繁体   English   中英

Python - 确定列表是否对称的算法

[英]Python - Algorithm to determine if a list is symmetric

所以我一直坚持这个问题,我被要求在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

有人可以帮我修改代码,以便它可以在这些“不规则形状”的数组上工作吗?

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

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

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

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

唯一的复杂因素是zip返回元组而不是列表,因此我们必须确保square是一个元组列表,以便进行比较。

您可以在功能开始时进行此检查:

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

或者更短

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

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

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

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

在开头附近添加:

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

Python3的一个版本

def symmetric(L)
    return all(i==j for i,*j in zip(L ,*L))

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

def symmetric(square):
    final_result = []
    x = 0
    while x < len(square):
         y = 0
        row_list = []
        .
        .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM