2017-08-10 4 views
0

私は、数独ゲームのような四角形でなければならないリストとそのコンポーネントもリストであり、出力として入力を取る手続き(対称(p))を作成しようとしています「正方形」が対称であるかどうかを示す真または偽の値。基本的な数独のようなプログラム

最初の行が最初の列と等価であり、2番目の行が2番目の列と等価である場合、正方形は対称です。さて、私はコードを書いたが動作しません。その出力は常にTrueです。コードの貼り付けは次のとおりです。

def column_building(list, position): 
    column = [] 
    for i in list: 
    column.append(i[position]) 
    return column 

a = [[1, 2, 3], 
    [2, 3, 4], 
    [3, 4, 1]] 

b = [["cat", "dog", "fish"], 
    ["dog", "dog", "dog"], 
    ["fish","fish","cat"]] 

def symmetric(p): 
    counter = 0 
    for e in p: 
    if e == column_building(p, counter): 
     counter = counter + 1 
     return True 
    else: 
     return False 
     break 

print symmetric(b) 

コードでは、最初の手順では、決定された位置の列がわかります。 abは、例として使用するために作成したリストです。そして、私が言ったように、常にTrueを出力しますが、eがリストの2番目の要素であるbを使用すると、2番目の位置([dog, dog, fish])で構築された列と等しくありません。

答えて

2

Pythonの魔法!

def symmetric(p): 
    return list(map(list, zip(*p))) == p 

ここで、zip(*p)は、指定されたリストのリストを転記するだけです。実際には、transpose(p) == pかどうかを確認する必要があります。

Python 2.7を使用している場合は、外部呼び出しをlistに削除できます。私はあなたがtranspose(p) == p

+1

はい、これが最良の答え1です。タプルを含むリストの場合は単にリスト(zip(* b))になるので、これは代替の可能性があります。 ** list(zip(* b))== list(map(tuple、b))** –

+0

助けてくれてありがとう!しかし、私はpythonの魔法(haha)のこの事の本当の初心者なので、私はそれらの関数を学んでいないので、私はそれらなしで活動を並べ替える必要があります。 –

-1

、私がお勧めしたい:あなたは間違っている時などにTrueFalseを返した

def symmetric(p): 
    counter = 0 

    for e in p: 
     if e != column_building(p, counter): 
      return False 
     counter += 1 

    return True 

問題はあなたが作っているよりも簡単です。

+0

'transpose'関数はどこにありますか? – ForceBru

+0

npyとしてインポートnumpy:np.array(b)== np.array(b).T –

0

はあなたのコードを修正する(というよりも置き換え)するかどうかをチェックする必要があると信じてい

+0

ありがとうございました。さて、私はまだ列挙するような機能を学んでいなかったので、このコードをそれなしで動作させる方法がなければならないと私は思います。それとは別に、元のコードで何が間違っているのか教えてください。私はそれが動作しないため間違っていることを知っているが、私は本当に理由を見ていない、私が書いた、または書いたのは基本的です:最初の行が最初の列と等しい場合は、 Trueで、p(リスト)の次の要素(リスト)に移動し、そうでなければFalseを返してループを終了します。 –

+0

@ PedroLopez、私は、基本的に同じことを行う 'enumerate()'の代わりにオリジナルのカウンタロジックを使用するように答えを更新しました。ループ内から 'True'を返したため、元のコードが間違っていました。ループ中に 'False'を返すこともできます。*テストが失敗した場合でも、ループが完了して*すべての*テストが成功するまでは' True'かどうかを知ることはできません。 – cdlane

+0

オハイオ州大丈夫、ありがとう! –

0

numpyのバージョン:

import numpy as np 

b = [["cat", "dog", "fish"], 
["dog", "dog", "dog"], 
["fish","fish","cat"]] 

np.all(np.array(b) == np.array(b).T) # all True = True, else False 
関連する問題