ubuntuusers.de

Python: Zahl aus string?

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

ruiin

Anmeldungsdatum:
6. Oktober 2009

Beiträge: 163

Hi,

scripte mir grad ein kleines Programm um mehrere chemische Sachen zu errechnen. würde am liebsten so viele infos wie möglich mit einer eingabe (zahlen und strings) abfragen und auswerten gibt es eine möglichkeit ein oder mehrere Zahlen mit einer funktion (o.a.) aus einem String rauszubekommen?

	op = raw_input('Bitte geben sie ihre Operation ein: ' )
	#MUSS
	if op.startswith('stark'): stark = True
	if op.startswith('mittel'): mittel = True
	if op.startswith('schwach'): schwach = True
	optrue = stark or mittel or schwach
	#KANN
	if '-b' in op: base = True
	#if '-c' in op: cflux = True
	#STEUERUNG
	if op.startswith('exit'):
		break
	if '-h' in op:
		print u'''Syntax:
		[stark/mittel/schwach] [-s/-b] [Konzentration(0)] 
		'-h' ist die Hilfeoption''' 	

momentan kann ich nur eine Zahl mit float rausbekommen.

danke.

deadtronic

Anmeldungsdatum:
18. Februar 2010

Beiträge: 762

>>> "3" * 3
'333'
>>> int("3") * 3
9

>>> text = "3692"
>>> text[0]
'3'
>>> text[1]
'6'
>>> int(text[1])
6

Übrigens: optparse ist die bessere Variante, mitgegebene Optionen auszulesen.

ruiin

(Themenstarter)

Anmeldungsdatum:
6. Oktober 2009

Beiträge: 163

Das Problem ist:

Ich hab einen Strin vom Nutzer der Momentan so aussieht 'Formel Option Zahl' ambesten währe 'Formel Option Zahl Zahl'. Ich weis nicht wie lang die Zahlen sind, sie können 6.078487353 oder 6.95 sein. Es sind häufig Kommazahlen.

kann man die komplett importieren? Oder Muss ich den string erstmal zerlegen und die Länge festlegen? Die zweite Zahl kann ich vllt auf zwei stellen hinter dem Komma festschreiben. Damit den String von hinten und forne aufblösen bis die erste Zahl übrig bleibt.

danke für dne tipp mit den optionen.

Barabbas

Avatar von Barabbas

Anmeldungsdatum:
31. März 2007

Beiträge: 1651

Wohnort: Münster

Hallo,

wenn dein String tatsächlich die Form "Formel Option Zahl [optionale Zahl]" hat, dann suchst du vermutlich die Methode .split():

>>> data = raw_input("Bitte FORMEL OPTION ZAHL [ZAHL] eingeben: ")
Bitte FORMEL OPTION ZAHL [ZAHL] eingeben: x+y ? 3 4
>>> data
'x+y ? 3 4'
>>> data.split()
['x+y', '?', '3', '4']

Das bedeutet aber, dass z.B. in der Formel keine Leerzeichen gesetzt werden dürfen, da Whitespace-Zeichen hier als Trenner fungieren. Alternativ kannst du natürlich auch einen eigenen Trenner definieren - etwa Kommata:

{>>> data = raw_input("Bitte FORMEL,OPTION,ZAHL,[ZAHL] eingeben: ")
Bitte FORMEL,OPTION,ZAHL,[ZAHL] eingeben: x + y, ?, 3, 4 
>>> data
'x + y, ?, 3, 4 '
>>> data.split(",")
['x + y', ' ?', ' 3', ' 4 ']

Wenn es dir wirklich nur um die Zahlen geht, reicht auch ein regulärer Ausdruck, also grob:

import re
re.findall(r" ([0-9.]+)", "x+y -h 0.56498646 65465")

Du kannst übrigens auch einfach eine kleine Schleife schreiben, die die erforderlichen Felder der Reihe nach abfragt. Das ist relativ leicht zu erweitern und erspart es dem Nutzer, sich Gedanken über die richtige Eingabeform (Trennzeichen?) zu machen. Weiterhin kannst du mit ein paar Zeilen Code mehr beliebig viele weitere Zahlen abfragen. Um die Reihenfolge der Eingabe zu konservieren, wäre es dann uU sinnvoll, das Dict durch eine Liste zu ersetzen.

>>> fields = ["FORMEL", "OPTION", "ZAHL1", "ZAHL2"]
>>> user_input = {}
>>> for field in fields:
...     result = raw_input("Bitte geben sie nun '{0}' ein. ".format(field))
...     user_input[field] = result
... 
Bitte geben sie nun 'FORMEL' ein. x+y
Bitte geben sie nun 'OPTION' ein. -h
Bitte geben sie nun 'ZAHL1' ein. 51
Bitte geben sie nun 'ZAHL2' ein. 312
>>> user_input
{'FORMEL': 'x+y', 'OPTION': '-h', 'ZAHL2': '312', 'ZAHL1': '51'}
>>> 

Wie gesagt, ist natürlich nicht vollständig. Vermutlich möchte man noch Abbruchbedingungen / Strings definieren - etwa wenn "" oder "exit" eingegeben wurden.

Besten Gruß,

brb

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

ruiin schrieb:

1
2
3
4
	if op.startswith('stark'): stark = True
	if op.startswith('mittel'): mittel = True
	if op.startswith('schwach'): schwach = True
	optrue = stark or mittel or schwach

Das sieht mir auch nicht grad einem sinnvollen Design aus. Du testest drei verschiedene Werte ab, von denen aber nur einer jeweils gewählt werden kann und bindest diesen Wert dann aber an unterschiedliche Namen. wie willst Du später damit weiterarbeiten?

Ich vermute mal, dass es sinnvoller ist, sich den String zu merken und später anhand des Wertes zu verzweigen. Das kann man natürlich erst dann beantworten, wenn man sieht, wie Du die Parameter später für Berechnungen verwendest.

ruiin

(Themenstarter)

Anmeldungsdatum:
6. Oktober 2009

Beiträge: 163

In der Eingabesyntax steht Formel nicht für eine explizite formel sondern für einen der drei später abgefragten teile 'stark','mittel' und 'schwach'.

die werden dann abgefragt und im hinteren teil des codes leiten diese formel-variablen eine if anweisung ein die dann zur richtigen formel leiten. die variable optrue wird nur erzeugt um sie am ende des input-code-teils zum einleiten der fehlermeldung zu verwenden. (falls keine der drei fromel-variablen = true ).

Also sinngemäß

op = raw_input('Gib was ein: ' )
if op.startswith('stark'): stark = True
if op.startswith('mittel'): mittel = True
if op.startswith('schwach'): schwach = True
optrue = stark or mittel or schwach
if not optrue:
    break
    print 'fehlermeldung'
if stark: 
    formelstark(x, y)
...

ich werde mal das mit dem split probieren hört sich interessant an.

PS: gibs eine operation aus einer standart-libary die log macht? ich benutz momentan das modul mpmath dafür, die ist aber normalerweise nicht vorinstalliert.

Barabbas

Avatar von Barabbas

Anmeldungsdatum:
31. März 2007

Beiträge: 1651

Wohnort: Münster

Es gibt das Modul "logging".

Besten Gruß,

brb

ruiin

(Themenstarter)

Anmeldungsdatum:
6. Oktober 2009

Beiträge: 163

hab jetzt mal die gesamte auswertung der eingabe in eine eigene funktion gepackt. Mit split zerteile ich den string doch wenn er nun die beiden zahlen in float umwandeln soll streigt er mit:

ValidError: invalid literal in float (): t

der Code der Funktion ist:

def operatoren(x):	
	x.split()
	f = x[0]
	o = x[1]
	az = x[2]
	bz = x[3]
	#Zahlen:
	if az:
		cs = float(az)
	else:
		cs = raw_input('Geben sie eine Konzentration an: ' )	
		cs = float(cs)			
	if bz: 
		pkx = float(az)
	#Formeln:
	if f == 'stark':
		stark = True
	if f == 'mittel': 
		if pkx > 4.5 and pkx < 9: 
			mittel = True
		else:
			fail = False
			print 'nicht mittelstark!'
	if f == 'schwach':
		if pkx < 4.5:
			schwach = True
		else:
			fail = False
			print 'nicht schwach!'
	optrue = stark or mittel or schwach
	#Optionen:
	if 'b' in o: base = True
	if 'cH' in o: cflux = True
	#STEUERUNG
	if 'exit' in f:
		exit = True 
	if 'h' in o or f:
		print u'''Syntax:
		[stark/mittel/schwach] [-s/-b] [Konzentration(0)] 
		'-h' ist die Hilfeoption''' 	
	global stark; mittel; schwach; exit; optrue; base; cflux; fail

wie bei den if anweisungen zu az und bz habe ich angedeutet das ich erst überprüfen will ob die variablen überhaupt inhalt haben. es gibt formeln wo ich nicht beide zahlen brauche, dann muss ich sie auch nicht abfragen. (float soll da kein interrupt verursachen)

Antworten |