Allgemeine Frage zu If-Anweisung mit Strings

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
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Hallo zusammen,

ich möchte gerne eine for-Schleife bilden mit If-Anweisungen darin.
Als if-Anweisung soll verglichen werden, ob ein Objektname die Buchstaben "(1)" enthält. Allerdings sind alle Objektnamen deutlich länger. die "(1)" ist aber der letzte Teil wenn er denn vorkommt.
Wie bekomme ich das als Code?

Hier mein Versuch:

Code: Alles auswählen

for dslmodel in dslmodel_L3:
	freq = dslmodel.params[0]
	app.PrintPlain(freq)
	if ElmRelay.loc_name == "*0"
	dslmodel.params = [49,0.65,0.1,0.1]
	elif ElmRelay.loc_name == "*(1)"
	dslmodel.params = [49,0.65,0.1,0.1]
	elif ElmRelay.loc_name == "*(2)"
	dslmodel.params = [49,0.65,0.1,0.1]
	else
	dslmodel.params = [0,0.65,0.1,0.1]
Kann mir jemand bei dem Stringvergleich behilflich sein?
BlackJack

@satefa: Du suchst die `endswith()`-Methode auf Zeichenketten. Und eventuell eine Schleife über Endungen und Parameterwerte.

Edit: Bei den gezeigten Werten gibt es ja nur zwei verschiedene Listen für das `params`-Attribut, und die unterscheiden sich auch nur im ersten Element. Ungetestet:

Code: Alles auswählen

    for dslmodel in dslmodel_L3:
        app.PrintPlain(dslmodel.params[0])
        dslmodel.params = [
            49 if ElmRelay.loc_name.endswith(('0', '(1)', '(2)')) else 0,
            0.65,
            0.1,
            0.1,
        ]
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Danke schonmal :)

Die Werte sollten eigentlich nur im ersten 49 sein. In der zweiten elif 48.7 und der nächsten 48.4 jeweils statt der 49
Aber dann wird es genau so funktionieren oder?
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Kann ich der endswith Methode auch sagen, dass der String mit einer Zahl von 1 bis 40 endet?

Ich habe meinen Code nun so:

Code: Alles auswählen

dslmodel_L3 = app.GetCalcRelevantObjects("Decision_DSL.ElmDsl")

for dslmodel in dslmodel_L3:
    app.PrintPlain(dslmodel.params[0])
    dslmodel.params = [
	49 if ElmRelay.loc_name.endswith((' 0', ' 1', ' 2', ' 3', ' 4', ' 5', ' 6', ' 7', ' 8', ' 9', ' 10', ' 11', ' 12', ' 13', ' 14', ' 15', ' 16', ' 17', ' 18', ' 19', ' 20', ' 21', ' 22', ' 23', ' 24', ' 25', ' 26', ' 27', ' 28', ' 29', ' 30', ' 31', ' 32', ' 33', ' 34', ' 35', ' 36', ' 37', ' 38', ' 39', ' 40'))
	48.7 if ElmRelay.loc_name.endswith('(1)')
	48.4 if ElmRelay.loc_name.endswith('(2)')	
	else 0,
    0.65,
    0.1,
    0.1,
	]
Wird für 49 auch auf das Leerzeichen vor den Ziffern geachtet?
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Die kann nur einen String nehmen. So etwas laesst sich ggf. mit einem regulaeren Ausdruck formulieren:

Code: Alles auswählen

#!/usr/bin/env python3
import re

def main():
    prefix = "foobar"
    rex = r"^[^0-9]+(40|[123]\d|[1-9])$"
    for i in range(100):
        s = "{}{}".format(prefix, i)
        print(s, bool(re.match(rex, s)))


if __name__ == '__main__':
    main()
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Auch dir danke, aber das scheint mir für mich zu kompliziert. Bin leider kein Profi in Python xD

Ich versuche es jetzt in einzelschritten zu machen.

Code: Alles auswählen

dslmodel_L3 = app.GetCalcRelevantObjects("Decision_DSL.ElmDsl")
relay = app.GetCalcRelevantObjects("*.ElmRelay)
for dslmodel in dslmodel_L3:
    app.PrintPlain(dslmodel.params[0])
    dslmodel.params = [
		48.7 if relay.loc_name.endswith('(1)') else 0, 
		0.65,
		0.1,
		0.1,
		]
Hier bekomme ich eine Fehlermeldung für Zeile 2. Es gibt insgesamt 1851 Objekte vom Typ ElmRelay.

Folgender Fehler erscheint:
"SyntaxError: EOL while scanning string literal"

Jemand eine Idee?
__deets__
User
Beiträge: 14540
Registriert: Mittwoch 14. Oktober 2015, 14:29

na was sagt denn die Meldung? End Of Line waehrend versucht wird, ein String-Literal (also zB "foobar") zu parsen. Dann schau mal genau in deine Zeile zwei... da fehlt etwas.
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Fehler gefunden, was ein doofer :P

Jetzt habe ich noch eine Frage:

Code: Alles auswählen

relay = app.GetCalcRelevantObjects("*.ElmRelay")
for i in range(1,1852):
	for dslmodel in dslmodel_L3:
			name = relay[0].loc_name
    		dslmodel.params = [48.7 if name.endswith('(1)') else 0,0.65,0.1,0.1]
wie kann ich "relay[0]" variabel gestalten, dass er alle Elemente durchgeht. also quasi von 0 bis 500 oder so? Also von relay[0]......relay[500] ?
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Noch eine allgemeine Frage:

Kann ich in diesem Teil:

Code: Alles auswählen

 dslmodel.params = [48.7 if name.endswith('(1)') else 0,0.65,0.1,0.1]
auch angeben, dass bei "else" nichts gemacht werden soll. Also es soll einfach der Wert der vorher stand (z.B. 49) einfach bleiben?
BlackJack

@satefa: Nein, da muss ein Wert stehen. Einen Wert ”vorher” gibt es da ja nicht. Du kannst aber natürlich Code hinschreiben der den Wert ermittelt der bei `dslmodel.params` an Index 0 steht.
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Also kann ich die 0 ersetzen durch beispielsweise:

dslmode.params[0]

?

Es stehen vorher überall schon Werte drin, die ich durch den Code ja gerne ändern möchte.
BlackJack

@satefa: Genau.

Dein Code ersetzt keine Werte in einer Liste sondern erstellt eine neue Liste und weist die dann dem `params`-Attribut zu. Das und was die Liste später vielleicht mal ersetzt, weiss Python beim Auswerten der rechten Seite der Zuweisung ja nicht.
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

gibt es auch einen Befehl der "beinhaltet" heißt?
Also anstatt "endswith" möchte ich überprüfen ob ein bestimmter Buchstabe enthalten ist..
BlackJack

@satefa: Es gibt den ``in``-Operator:

Code: Alles auswählen

In [6]: 'th' in 'python'
Out[6]: True
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Ich glaube das kann ich so nicht anwenden.
Ich bräuchte etwas das meine Listen-strings überprüft so wie beim endswith.

etwa so:

Code: Alles auswählen

dslmodel.params = [0 if relay.loc_name.in("G0") or relay.loc_name.in("L0") else dslmodel.params[0], 0.65, 0.1, 0.1]
Also wenn "G0" enthalten ist soll er 0 schreiben.
BlackJack

@satefa: Doch das kannst Du verwenden. Du musst es nur richtig schreiben, also als Operator und nicht als Methodenaufruf.
satefa
User
Beiträge: 10
Registriert: Dienstag 11. Juli 2017, 13:36

Ich habe es hinbekommen.

Danke für eure Hilfestellungen :)
Antworten