2012-03-22 3 views
1

ここでの目標は、[[1,2],[3,4],[7,1]]のような座標のリストを取って、これらの座標をすべて印刷する場合のキャンバスの大きさを計算することです。最大の左下座標と、これらの点にキャンバスがぴったり合う最小の右上座標を取ってください。たとえば、上記のリストでは、[[1,1],[7,4]]を探しています。これは、すべてのポイントが収まる最小の矩形を定義しています。Python:短い座標関数が入ってくる引数の値を予期せず変更する

この関数の途中で、受信した "ボード"に新しい値が割り当てられています。ループの着信boardの座標を移動するとき

def print_board(board): 
    # import pdb; pdb.set_trace() 
    dimensions = None 
    for i in board: 
     if dimensions == None: 
      dimensions = [i, i] 
     else: 
      dimensions[0][0] = min(dimensions[0][0], i[0]) 
      #'board' is redefined !!! 
      dimensions[0][1] = min(dimensions[0][1], i[1]) 
      #dimensions[1][0] = max(dimensions[1][0], i[0]) 
      #dimensions[1][1] = max(dimensions[1][1], i[1]) 
    # (after we get the canvas size 
    # we print the canvas with the points on it 
    # but we never make it that far without an error) 

は、それが一度に見ている座標何にboard[0]を設定しているようです。したがって、[[1,2],[3,4],[7,1]]は、最初に[[3,4],[3,4],[7,1]]に、次に[[7,1],[3,4],[7,1]]に変更されます。

boardはまったく変更されません。そのポイントのコピーをしていない - あなたがあなたのボードの最初の点にdimensionsで両方の項目を設定している

dimensions = [i, i] 

を行う

(Pythonの3.2.2)

答えて

3

が、あなたはあなたが同じポイントを更新している

 dimensions[0][0] = min(dimensions[0][0], i[0]) 
     dimensions[0][1] = min(dimensions[0][1], i[1]) 

を行うとき---あなたのボードで最初のポイント - min関数の結果に。お使いのボードがnumpyのであれば

import numpy as np 
def print_board(board): 
    a = np.array(board) 
    return [a.min(axis=0).tolist(), a.max(axis=0).tolist()] 

ではなく、このような何かを試してみてください:agfs答えの延長として

def print_board(board): 
    xs, ys = zip(*board) # separate out the x and y coordinates 
    min_x, max_x = min(xs), max(xs) # find the mins and maxs 
    min_y, max_y = min(ys), max(ys) 
    dimensions = [[min_x, min_y], [max_x, max_y]] # make the dimensions array 
+0

私はそれが疑念を抱いていた、という言葉を引用しないで、値渡し/参照渡しの問題です。 for文でイテレータの現在の状態のコピーを作成する方法はありますか? どうすればいいですか? dimension = list(str([i、i]))(ちょっと、あれがあれば...) – Brownbat

+0

@Brownbat 'dimensions = [i [ 、i [:]] 'は動作します。 '[:]'はリストのコピーを作成します。しかし、私は前にではなく、minsとmaxsを見つけたので、 'dimensions'を構築することをお勧めします。これはPythonであり、C言語ではありません。 – agf

+0

あなたのご協力ありがとうございます。あなたはそれがforループではないと言っていると思いますが、コピーを難しくするリストがあります。何らかの理由で、 'mylist = [2,3]; i = mylist [0];私はmylistを変えていないようだ... mylist:i; x = i; x = 3'はmylistを3に設定していない。理解していますが、フィードバックの公平な分担以上のものを与えているので、ここでロールして中間値を使用してください。 – Brownbat

0

を、あなたも、より効率的かつ簡潔なコードのためのnumpyを使用することができます配列が既にあり、関数がnumpy配列のタプルを返すようにすると、さらに短くなります。

def print_board(board): 
    return board.min(axis=0), board.max(axis=0) 
+0

これは良い方法ですが、彼の質問には何も関係していません。その理由は、ボードが突然変異しているのですから、本当に回答として投稿するべきではありません。 – agf

+0

@agf私はあなたの意見を見ますが、私は同意しません。[このメタ質問](http://meta.stackexchange.com/a/117222/157794)を参照してください。私はそれがこの事件にうまく合っていると思います。そのような答えを許すのが感情です。私があなたの答えに基づいて構築していると言うことで、私は代替案を提案していることを明確にし、パフォーマンスと関連していると言います(「なぜそれが示唆されているのか」を参照)。 –

+0

彼の質問が「これを行うためにPythonリストを使うにはどうすればいいのですか」や「これを行うために 'max'と' min'組み込み関数を使うにはどうすればよいのでしょうか?実際に一般的な問題を解決する方法を探していたのですが、彼はなぜボードが突然変異しているのかを知りたかったので、本当の問題は名前と可変型がPythonでどのように機能するかということでした。 – agf

関連する問題