2016-11-04 8 views
0

Ich brauche eine Eingabezeile vom Benutzer. Es muss eine Reihe von Zahlen durch Leerzeichen getrennt sein. Ich muss die Eingabe in eine Reihe von Point Objekten analysieren. Die Punkte sind wie Punkte auf einer kartesischen Ebene (x, y). Und schließlich habe ich jene hinweisen, (1, 2) zu drucken, (3, 4), (5, 6) usw.Parsen von Zahlen in Punktobjekte in Python

Wenn die Eingabe

"0 1 2 3 4 5" 

die ausgegeben werden soll

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

der Code haben, so sieht weit wie

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) 

ist dieser Code aussehen wie sie auf dem richtigen Weg ist?

Ich bin auf diese Aufgabe etwas verloren. Nicht sicher, wie Objekte wirklich noch funktionieren, jede Erklärung würde geschätzt werden. Vielen Dank.

+1

Nur zur Klarstellung, wenn der Eingang ist "0 1 2 3 4 5" sollte der Ausgang sein (0, 1), (2, 3), (4, 5) – dvdktn

+0

Ja, wenn Sie klären können, was Sie eingeben erwarte, dass das den Prozess nützlicher macht. –

+0

Die Eingabe muss eine gerade Zahl von Ganzzahlen sein, die durch Leerzeichen getrennt sind. Token ist eine Liste dieser Zahlen in String-Form, und ich muss irgendwie ein Objekt für jede Gruppe von zwei Ganzzahlen in der Liste, die einen Punkt (x, y) darstellen, erstellen – dvdktn

Antwort

2

Sie können die Zeichenfolge in Leerzeichen aufteilen und dann die alternativen Elemente der Aufteilungsliste komprimieren.

s = "0 1 2 3 4 5" 

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

Der dritte Parameter zu einer Scheibe ist der Schritt. Es braucht also jedes zweite Element aus der Liste (0, 2, 4, usw.) und das zweite Stück ist auch ein Stück mit Schritt 2, aber beginnend mit dem Index 1 (1,3,5, usw.).

Der Aufruf list ist nur da, um sofortige Auswertung für die Druckanweisung zu erzwingen. Es ist nicht erforderlich, wenn Sie später über den Rückgabewert zip iterieren.

Die obigen Ausgänge tuples. Wenn Sie sie in Point Objekte verwandeln wollen.

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

Es sieht ein bisschen magisch, aber im Wesentlichen ihres Aufruf nur den Point Konstruktor in einer Schleife mit jedem Paar von Werten. Der map(float, t) Teil konvertiert die beiden Koordinaten in Gleitkommazahlen (ich folgerte dies aus Ihrer __str__ Methode) und die * explodiert das Tupel in die 2 Werte für den Konstruktor.

Der Ausgang ist

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

Sie nicht fragen, für alle die Hinter 0'en aber Ihre __str__ ist schwimmt Druck, so verließ ich es so.

Auch in Ihrem Beispiel versuchen Sie, die Liste selbst direkt mit print(points) zu drucken. Wenn Sie möchten, dass sich jedes Listenelement in dieser Situation selbst druckt, sollten Sie die Funktion __repr__ definieren.

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

Dies sollte Ihnen eine Liste der Tupel zurückgeben, die Sie möchten. Lassen Sie die für Schleife fallen; es ist in dieser Aussage enthalten (genannt "Listenverständnis").

Sie können feststellen, dass die Punktkoordinaten immer noch Zeichenfolgen sind. Möglicherweise möchten Sie die zwei Elemente im Tupel zu int konvertieren.

+0

Das ist ein kluger Weg, es zu tun, und tut es nicht Verlasse dich auf Python 3 Zip oder Python 2 iertools/izip. –

+1

Danke. Ich versuche, die Antworten auf dem allgemeinen technischen Niveau des OP zu halten. Zu viel Magie kann Menschen davor abschrecken, eine Sprache zu lernen. – Prune