2

だから私はPythonでn次元配列(それは彼らが何と呼ばれているのですか?)が「対称」であるかどうかをチェックする関数を書くように頼まれました。配列の 1 == 列 1、行 2 == 列 2、行 3 == 列 3 など。目標は、対称の場合はブール値の True を返し、そうでない場合は False を返す関数を持つことです。

私は機能する関数を書くことができましたが、サイズが完全な正方形 (例: 2 x 2、4 x 4) のリストでのみ機能し、テスト ケースのいくつかは「不規則な」サイズ (例: 2 ×5、3×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関数を使用して正方形を転置できます。これはいくつかのシーケンスを取り、それぞれの最初を含むタプルを返し、次にそれぞれの2番目を含むタプルを返します。各行を個別の引数として渡すときに渡す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

Python3 用のバージョン

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

これを最初の近くに追加します。

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