2012-03-11 14 views
0

私は以下のコードを書いていましたが、最初のループが終了してFalseを返さない場合、フローは2番目のwhileループに従います。しかし、フローは2番目のwhileループをスキップし、単にTrueを返します。何故ですか?この問題を解決するにはどうしたらいいですか?最初のwhileループから2番目のwhileループに移動した後にフローを作成しますか?Pythonで2つのwhileループが次々に(他のループの内側ではなく)連続して動作しないのはなぜですか?

square = [[1,2,3,4],[4,3,1,4],[3,1,2,4],[2,4,4,3]] 
# this is an auxiliary function 
def getSum(lis): 
sum = 0 
for e in lis:   
    sum = sum + e 
return sum 

# here is where the problem is 
def check_game(square): 
standardSum = getSum(range(1, len(square)+1))  

while square: #this is the first while loop 
    row = square.pop() 
    print row, 'row', 'sum of row=', getSum(row) 
    if standardSum != getSum(row): 
     return False 
m = 0 
while m < len(square): # the second while loop, which the flow skips 
    n = 0 
    col = [] 
    while n < len(square): 
     col.append(square[n][m]) 
     n = n + 1 
    print col, 'column' 
    if standardSum != getSum(col): 
     print standardSum, ' and sum of col =', getSum(col) 
     return False    
    m = m + 1 
return True 
+2

インデントをチェックし、ここであなたの実際のコードは –

+0

1 @AramKocharyanに一致します。どちらのwhileループのcheck_gameのfuncitonの内側に実際にあります。 –

+0

はい、私は間違って貼り付けますが、私の.pyファイルには正しい字下げがあります。ありがとう、アラム。 – craftApprentice

答えて

5

squareに残っ項目がないときに最初のループのみを終了します。最初のループの後にlen(square)0になるため、2番目のループm < len(square)の入力条件はFalseになります。

+0

はい、まさに!四角形の要素の数を減らす.pop()のために私はそれを取得しませんでした。 – craftApprentice

+1

@ Pythonistaの講習:[katriealalex 'answer](http://stackoverflow.com/a/9657676/279627)のコードを勉強してください。これは、より表現力豊かで読みやすい簡潔な方法で。そのコードを理解しようとすると、Pythonについて多くのことを学ぶかもしれません! –

1

while square:は、squareが空の場合に終了します。 len(square) == 0に従うので、m=0の場合、m < len(square)はfalseと評価されます。

+0

はい、まさに!四角形の要素の数を減らす.pop()のために私はそれを取得しませんでした。みんなありがとう! – craftApprentice

0

長さと増分変数をチェックするので、何回反復することになるのか分かっています。代わりにforループを使用してください。これにより、インクリメントを初期化して、同じ行の各ループを調整することができます。これにより、将来的には無限ループにつながる問題を避けることができます(これは問題ではありませんが、私は指摘することが適切だと考えています)。

+0

賢明なアドバイスをありがとう。 – craftApprentice

1

square.pop()squareから行を返し、を除去し、従ってlen(square)は、第二のループにゼロです。

機能と同じことを行う組み込み関数sumもあります。

+0

はい、まさに!四角形の要素の数を減らす.pop()のために私はそれを取得しませんでした。 – craftApprentice

0

これにしながら、あなたはあなたの最初を置き換えることによって、あなたのエラーを回避することができます

for row in square: 
    print row, 'row', 'sum of row=', getSum(row) 
    if standardSum != getSum(row): 
    return False 
2

FYIあなたのコードは非常に(非常に非常に非常に)非慣用Pythonのです - それははるかにC.

のような書かれています

これは、Pythonが普通に書かれているような書き換えです。

square = [[1,2,3,4],[4,3,1,4],[3,1,2,4],[2,4,4,3]] 
transpose = lambda i: zip(*i) 

def is_magic(square): 
    n = len(square) 
    s = n*(n+1)/2 

    return all(sum(row) == s for row in square) and \ 
      all(sum(col) == s for col in transpose(square)) 

あなたは行列を処理するためのPythonモジュールである、numpyを検討することもできます。それ付:

def is_magic(square): 
    n = len(square) 
    s = n*(n+1)/2 

    return all(m.sum(0) == s) and all(m.sum(1) == s) 
+0

まあ、私はこのコードを理解するのが好きです...私はアイデアを得るためにそれを5回読みました...しかし、それはまだ私のためではありません。この美しいコードのためにKatrielalexをありがとう! – craftApprentice

+0

@ Pythonistaの習慣は心配しない。まず、[リスト内包表記](https://en.wikipedia.org/wiki/List_comprehension#Python)を頭で囲む必要があります。 '転置'は単なるトリックです。 – katrielalex

関連する問題