簡體   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