2016-11-04 8 views
0

ユーザから入力行を取得する必要があります。スペースで区切られた一連の数字 でなければなりません。入力を一連のPointオブジェクトに解析する必要があります。 点はデカルト平野(x、y)上の点に似ています。入力は出力があるべきPythonのポイントオブジェクトへの数値の解析

"0 1 2 3 4 5" 

ある場合、最終的に、私は、それらは次のように指摘する(1,2)、(3,4)、(5,6)、等

を印刷する を有します

(0, 1), (2, 3), (4, 5) 

コードは、これまで

よう
class Point: 
    def __init__(self,x,y): 
     self.x = x 
     self.y = y 
    def __str__(self): 
     return ('(%f, %f)' % (self.x,self.y)) 
if __name__ == "__main__": 
    points = [] 
    usrIn = input() 
    tokens = usrIn.split(' ') 
    for token in tokens: 
     #not sure what to do here **************** 
    print(points) 

に見える持っていることは正しい軌道に乗っているように、このコードは見ていますか?

私はこの割り当てにちょっと迷っています。どのようにオブジェクトが実際にはまだ動作しているか分かりませんが、どんな説明も理解できます。ありがとう。

+1

入力が「0 1 2 3 4 5」の場合、出力は(0,1)、(2,3)、(4,5)になります。 – dvdktn

+0

ええ、そのプロセスがより有用であることを説明することが期待されます。 –

+0

入力はスペースで区切られた偶数の整数でなければなりません。トークンは文字列形式の数字のリストです。リスト(x、y)を表す2つの整数のグループごとに何らかのオブジェクトを作成する必要があります – dvdktn

答えて

2

文字列をスペースで分割し、分割リストの代替要素を圧縮することができます。

s = "0 1 2 3 4 5" 

x = s.split(); 
print(list(zip(x[::2], x[1::2]))) 

スライスの3番目のパラメータがストライドです。したがって、リスト(0,2,4など)から2番目の要素がすべて取り込まれ、2番目のスライスは2番目のストライドで、インデックス1(1,3,5など)から始まるスライスです。

list呼び出しは、print文のための即時評価を強制するためだけにあります。後で戻り値zipを反復する場合は、必須ではありません。

上記の出力はtuplesです。それらをPointオブジェクトに変換したい場合。

points = [Point(*map(float,t)) for t in zip(x[::2], x[1::2])] 
for p in points: 
    print('%s' % p, end='') 
print() 

それは少し魔法のように見えますが、基本的にそのだけの値の各ペアとのループでPointコンストラクタを呼び出します。 map(float, t)部分は2つの座標を浮動小数点数に変換します(私は__str__メソッドからこれを推論しました)。*はタプルをコンストラクタの2つの値に分解します。

出力はすべて、末尾0のために求めていませんでしたが、あなたの__str__は山車を印刷しているので、私はそのようにそれを残し

(0.000000, 1.000000)(2.000000, 3.000000)(4.000000, 5.000000) 

です。

また、あなたの例では、print(points)を使って直接リスト自体を印刷しようとします。このような状況で各リスト項目をカスタム印刷するには、__repr__関数を定義する必要があります。

1
points = [(tokens[i], tokens[i+1]) for i in range (0, len(tokens), 2)] 

これは、必要なタプルのリストを返します。ループの場合はを削除してください。このステートメントに含まれています(「リストの理解」と呼ばれます)。

ポイント座標はまだ文字列です。タプル内の2つの項目をに変換したい場合があります。

+0

これはスマートな方法であり、そうではありませんPython 3 zipまたはPython 2 itertools/izipに依存してください。 –

+1

ありがとうございます。私はOPの一般的な技術レベルで回答を維持しようとします。あまりにも多くの魔法は、人々が言語を学んでいないことを恐れることがあります。 – Prune