[英]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.