Seite 1 von 1
Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Dienstag 11. Juli 2017, 13:42
von satefa
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?
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Dienstag 11. Juli 2017, 13:46
von 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,
]
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Dienstag 11. Juli 2017, 13:54
von satefa
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?
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Dienstag 11. Juli 2017, 13:56
von satefa
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?
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Dienstag 11. Juli 2017, 14:16
von __deets__
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()
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Dienstag 11. Juli 2017, 14:36
von satefa
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?
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Dienstag 11. Juli 2017, 14:50
von __deets__
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.
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Dienstag 11. Juli 2017, 15:46
von satefa
Fehler gefunden, was ein doofer
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] ?
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 13:48
von satefa
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?
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 14:07
von 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.
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 14:10
von satefa
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.
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 14:39
von 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.
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 15:14
von satefa
gibt es auch einen Befehl der "beinhaltet" heißt?
Also anstatt "endswith" möchte ich überprüfen ob ein bestimmter Buchstabe enthalten ist..
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 15:17
von BlackJack
@satefa: Es gibt den ``in``-Operator:
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 15:25
von satefa
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.
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 15:36
von BlackJack
@satefa: Doch das kannst Du verwenden. Du musst es nur richtig schreiben, also als Operator und nicht als Methodenaufruf.
Re: Allgemeine Frage zu If-Anweisung mit Strings
Verfasst: Donnerstag 13. Juli 2017, 21:20
von satefa
Ich habe es hinbekommen.
Danke für eure Hilfestellungen
