String Tuple Konvertierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Python Freunde

Ich habe eine Modul-Methode die mir die Koordinaten
eines Rechteckes in einem String zurückgibt.
Der Inhalt des Strings mit Variablen dargestellt
enthält 'x1 y1 x2 y2'. Die einzelnen Koordinaten-
punkte sind mit einem Leerzeichen getrennt.
Also in mein Fall bekomme ich einen String mit
dem Format '0 0 150 11085' zurück.

Meine Frage ist:
Gibt es in Python eine Anweisung die mir diesen String
direkt in ein vierstelliges Integer Tuple umwandelt?

Ich kann mir nicht vorstellen, dass eine Methode, welche
für den Aufruf aus einem Pythonprogramm, ein Parameter
in einem solchen Format zurückgibt, welches programmier-
technisch in ein Tuple umformatiert werden muss.

Besten Dank für eure Hilfe
Gruss wuf :wink:
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
wuf hat geschrieben:Gibt es in Python eine Anweisung die mir diesen String
direkt in ein vierstelliges Integer Tuple umwandelt?

Code: Alles auswählen

>>> tuple([int(z) for z in '0 0 150 11085'.split()])
(0, 0, 150, 11085)
>>> 
Einfach wird es nicht gehen, denke ich.
Jan
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Jan

Deine Programmzeile macht genau was ich möchte.
Ein erstaunliches Konstrukt! Ich wäre nie auf
diese Idee gekommen. Ich wusste schlicht nicht,
dass Anweisungen in Python so kompakt in eine Zeile
verschachtelt werden können. Einfach Genial!
Die Programmiersprache "PYTHON" gefällt mir
immer mehr! Ich sehe hier kann noch vieles er-
forscht werden und ich muss noch vieles lernen.
Habe bei deinem Vorschlag auch die Anweisung
split() näher kennen gelernt.

Damit du etwas zu lachen hast zeige ich dir
was ich zusammengebraut habe um ein Tuple zu
erzeugen. Ich darf es fast nicht zeigen!

Code: Alles auswählen

		list = []
		accu = ''
		ptr  = 0
		region = '0 0 150 11085'
		for ptr in range(len(region)):
			if region[ptr] <> ' ':
				accu += region[ptr]
			else:
				list.append(int(accu))
				accu = ''
		list.append(int(accu))
		print tuple(list)
Recht vielen Dank für deine lehrreiche Hilfe Jan!
Gruss wuf :lol:
Take it easy Mates!
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo wuf!
wuf hat geschrieben:immer mehr! Ich sehe hier kann noch vieles er-
forscht werden und ich muss noch vieles lernen.
Habe bei deinem Vorschlag auch die Anweisung
split() näher kennen gelernt.
Mein Vorgehen, wenn ich mich mit den Möglichkeiten einer Programmiersprache vertraut machen will: Hin und wieder eine Referenz (oder ähnliches) in Buchform zur Hand nehmen und sich es damit in aller Ruhe aufm Sofa gemütlich machen, und dann einfach die Beschreibung der Methoden einiger Module lesen, um sich ein, wenn auch nur vages Bild zu machen, was das Modul kann. Wer 3 oder 4 Wochen nach dem Python-Einstieg sich noch von unentdeckten Methoden oder Funktionen der wichtigsten Klassen (string, file etc.) oder Module (os,sys,shutil etc.) überraschen lässt (von den built-ins ganz zu schweigen), hat bisher nicht richtig gelernt (sag ich mal so ;-)).
wuf hat geschrieben:Damit du etwas zu lachen hast zeige ich dir
was ich zusammengebraut habe um ein Tuple zu
erzeugen. Ich darf es fast nicht zeigen!
Larry Wall (Perl-"Erfinder") nannte sowas Babysprache, IIRC. Und er meinte das absolut nicht abwertend.
Jan
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Python Freunde

Ich möchte den folgenden String in ein Tuple
umwandeln:

eingabe: '200x300+10+20' # String

ausgabe: (200,300,10,20) # Tuple

Mein Lösungsansatz ist:

Code: Alles auswählen

# Entferne das Zeichen 'x' aus dem String
temp = replace(eingabe,'x',' ')

# Entferne die Zeichen '+' aus dem String
temp = replace(temp,'+',' ')

# Der String wird in Tuple umgewandelt
ausgabe = tuple([int(z) for z in temp.split()])
Frage:
Da ich mich noch nicht als Python-KRACK
bezeichen kann, ist es möglich diese
Umwandlung noch zu vereinfachen? Evt.
auf einen Einzeiler zu reduzieren.

Besten Dank für Eure Bemühung.

Gruss wuf :wink:
Take it easy Mates!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi wuf,

Code: Alles auswählen

>>> eingabe = '200x300+10+20'
>>> ausgabe = tuple(map(int,eingabe.replace("x","+").split("+")))
>>> print ausgabe
(200, 300, 10, 20)

Gruß

Dookie
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Dookie

Danke für Deine perfekte Aufösung meiner Aufgabe.
Sieht super aus. Zeigt wieder einmal mehr, dass
unsere Programmiersprache den Namen 'Hochsprache'
verdient.

Ich versuche sie immer besser auszusprechen, ist aber
leider noch stark mit einem Baby-Slang behaftet Hi. :P

Es beruhigt mich aber, wenn ich sehe was die Tkinter-
Leute mir für schwer verdauliche Daten auftischen.

Wie Du vielleicht festgestellt hast brauche ich diese
Umwandlung um mit der Kost umzugehen, welche mir die
Tkinter-Methode widget.winfo_geometry() in den Teller
legt. Warum diese Methode nicht direkt ein Tuple zu-
rückliefert wissen vermutlich die Tkinter-Leute am besten. :shock: :?:

Besten Dank Euch Tutoren Dookie und Jan
Es ist gut, dass es Euch gibt!

Gruss wuf :wink:
Take it easy Mates!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi wuf,

Tkinter kommt eben von tcl/tk und die manchmal seltsamen Parameter und Rückgaben kommen wohl daher.

Ich hab grad gesehen, daß jan vorher list-comprehension verwendet, damit gehts natürlich auch:

Code: Alles auswählen

ausgabe = tuple([int(a) for a in eingabe.replace("x","+").split("+")])
Python ist eben auch eine Sprache der vielen Wege ;)


Gruß

Dookie
Antworten