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