Guten Tag,
kennt jemand einen Weg wie ich mehrere Listen miteinander berechnen kann.
Zum Beispiel wenn ich zwei Listen habe, welche miteinander in Verbindung gebracht werden sollen. Dabei sind die Werte aus Meter genau für die Werte aus Kräfte die quasi "untereinander" stehen. Also beispiel die 1 soll zu 4 zugeordnet werden.
Meter = [0,1,2,3,4,5,6,7,8,9]
Kräfte =[2,4,8,8,4,6,5,1,5,4]
Nun möchte ich in der Meter Liste schauen, zum beispiel welche Werte zwischen 2 und 5 liegen.
Das hab ich so gelöst:
a = [ x for x in Meter if 2<x<=5]
a ist dann:
a = [3, 4, 5]
Ich muss aber nun Die Werte aus der Liste a mit der Liste Kräfte in Verbindung bringen. Zum Beispiel durch neue Listen
Also als Beispiel
[3, 8]
[4,4]
[5,6]
Ich hoffe ich konnte mein Problem verständlich erklären. Hat evtl. jemand eine Idee ?
Lg
Listen berechnung
schau mal hier
https://docs.python.org/3/library/functions.html#zip
https://docs.python.org/3/library/functions.html#zip
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
zipped = zip(Meter, Kräfte)
zipped = list(zipped)
print (zipped)
>>>[(0, 2), (1, 4), (2, , (3, , (4, 4), (5, 6), (6, 5), (7, 1), (8, 5), (9, 4)]
Danke das hat mir schon mal geholfen! Frage ist jetzt noch wie ich an nur die Werte dran komme die zwischen 2 und 5 stehen. Und wie ich die Werte dann miteinader Multipliziere. Also zum Beispiel 0*2 ; 1*4; und 2*8
zipped = list(zipped)
print (zipped)
>>>[(0, 2), (1, 4), (2, , (3, , (4, 4), (5, 6), (6, 5), (7, 1), (8, 5), (9, 4)]
Danke das hat mir schon mal geholfen! Frage ist jetzt noch wie ich an nur die Werte dran komme die zwischen 2 und 5 stehen. Und wie ich die Werte dann miteinader Multipliziere. Also zum Beispiel 0*2 ; 1*4; und 2*8
Na, du kombinierst den bisher angewendeten Code und bastelst eine List Comprehension:
Code: Alles auswählen
[m * k for m, k in zip(meter, kraefte) if 2 <= m <= 5]
Super Danke erstmal für die Hilfe. Ich tu mich irgendwie echt schwer mit Listen. Das ganzes ist für ein Statik Programm gedachte. Dabei soll der Benutzer die Länge eines Einfeldträgers und die einwirkenden Lasten( Einzel und Streckenlasten ) eingeben. Daraufhin werden die Auflagerkräfte berechnet und die Schnittkräfte in einem Abstand der auch vom Benutzer gewählt werden kann. Also jeden Meter als Beispiel. Ich habe die Listen getrennt von einander angelegt weil ich nicht wusste wie ich die Input Eingaben sonst in nur einer Liste zusammentragen hätte können. Ich habe jetzt zwei Listen ListeKräfte1 Und ListeMeter1 für die Einzellasten. Und drei Listen für die Streckenlasten. Die Auflager berechnet mein Programm schon. Ich hänge nur noch an den Schnittkräften. Und da hab ich mir halt überlegt, dass ich schaue in Welchem Abschnitt ich gerade schneide. Also als Beispiel bei von 2-3 Meter. Dann müssen alle Kräfte die in diesem Bereich wirken ausgewählt werden und mit den Hebelarmen multipliziert werden. Zumindest bei dem Momenten. Evtl hat ja jemand noch eine Bessere Lösung. Ich kann auch mal mein Programm Posten wenn das was hilft.
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Falls Du tatsächlich Namen wie `ListeKräfte1` und `ListeMeter1` im Quelltext stehen hast, solltest Du das überdenken. Der konkrete Datentyp hat im Namen nichts zu suchen. Bei Listen wählt man oft den Namen der für ein einzelnes Element passend wäre in der Pluralform. Englisch bietet sich da eher an, weil dort wesentlich weniger häufig Singular und Plural gleich sind, im Vergleich zu Deutsch. meter/meters vs. meter/meter beispielsweise. Wobei Meter hier vielleicht auch nicht so passend ist, denn die Meterangaben bedeuten ja sicher irgend etwas, und dann sollte diese Bedeutung am Namen ablesbar sein.
Wenn man Nummern an Namen anhängt, macht man in der Regel etwas falsch, denn dann will man entweder passendere Namen, oder eine Datenstruktur statt der einzelnen, nummerierten Namen.
Wenn man Nummern an Namen anhängt, macht man in der Regel etwas falsch, denn dann will man entweder passendere Namen, oder eine Datenstruktur statt der einzelnen, nummerierten Namen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
- sls
- User
- Beiträge: 480
- Registriert: Mittwoch 13. Mai 2015, 23:52
- Wohnort: Country country = new Zealand();
@ illyalarm: bitte poste doch mal deinen Code (unbedingt in Python-Code-Tags). Ich verstehe den Zauber mit den Listen noch nicht, da den Listen Formeln zur statischen Berechnung vorliegen (sollten), die aktuell `irgendwo` herkommen. Dazu gehört, dass eben auch Variablen z.B. für Normal-, Querkraft und Schnittmoment etc. und Einheiten wie N oder kN als Belastungsgröße definiert sind. Wenn die Formeln definiert sind, kannst du die Eingabewerte vom Benutzer entgegennehmen, daraus generierst du dann deine gewünschte Liste, in denen Werte mit Einheiten in relation stehen. Dafür stellt Python hervorragende Funktionen zur Verfügung.
Die Listen stehen aktuell lose gegenüber und ihre Herkunft ist nicht wirklich bekannt. Siehe dazu auch Sirius3's Hinweis.
Die Listen stehen aktuell lose gegenüber und ihre Herkunft ist nicht wirklich bekannt. Siehe dazu auch Sirius3's Hinweis.
When we say computer, we mean the electronic computer.
Also bis jetzt bin ich soweit:
Code: Alles auswählen
#Trägerlänge bestimmen
Eingeben = False
while not Eingeben:
try:
l = float(input("Gib die Länge deines Trägers ein: "))
Eingeben = True
except ValueError:
print("Das geht nicht. Bitte gib eine Zahl ein!")
print("Deine Trägerlänge beträgt",l,"meter")
#Kräfte eingeben lassen
print("das Eingabeformat ist „x, P“ für Einzellasten der Größe P [kN] an der Ordinate x [m] und „x1, x2, q“ für Streckenlasten der Größe q [kN/m] von der Ordinate x1 [m] bis zur Ordinate x2 [m].")
#Einzellast und zusammengerechnete Streckenlastlisten für Auflagerkräfte
listex1=[]
listex2=[]
#Steckenlast Listen und Einzallastlisten für Schnittkräfte
LISTEx1=[]
LISTEx2=[]
LISTEq1=[]
LISTEq2=[]
LISTEq3=[]
while True:
print(listex1)
print(listex2)
a = input("Gib deine Kräfte ein :")
#Bei keiner Eingabe Schleife stoppen
if a == '':
break
#Kräfte unterteilen in Einzelast und Streckenlast
#Dabei wird geschaut ob der Benutzer zwei oder drei Angaben für a eingegeben hat und dementsprechend in die Liste einsortiert
#Bei einer Streckenlasteingabe(3 Zahlen eingegeben) wird eine try Funktion eingeleitet
try:
#Die Eingaben den Variabeln x1,x2,q zuordnen
x1,x2,q = a.split(",")
#Eingaben in Gleitkommazahlen umwandeln
x1 = float(x1)
x2 = float(x2)
q = float(q)
#Eingaben für spätere Schnittkraftberechnung in Listen einsortieren
LISTEq1.append(x1)
LISTEq2.append(x2)
LISTEq3.append(q)
#Streckenlasten in Einzellasten umrechnen für Auflagerkräfte
xn = x1
x1 = x2 - x1
q = x1 * q
xm = (x1/2)
x1 = xm + xn
#Einzellasten für spätere Auflagerberechnung in Listen einsortieren
listex1.append(x1)
listex2.append(q)
#Bei einer Einzellasteingabe (2 Zahlen eingegeben) wird eine except Funktion eingeleitet
except:
#Die Eingaben den Variabeln x1,x2 zuordnen
x1,q = a.split(",")
x1 = float(x1)
q = float(q)
##Eingaben für spätere Schnittkraftberechnung in Listen einsortieren
LISTEx1.append(x1)
LISTEx2.append(x2)
#Einzellasten für spätere Auflagerberechnung in Listen einsortieren
listex1.append(x1)
listex2.append(q)
#Auflager ausrechnen
bv = [(listex1[i]*listex2[i])for i in range(len(listex1))]
print(bv)
bv= sum(bv)
print(bv)
bv = bv/l
print(bv)
av = sum(listex2)-bv
round(bv,2)
round(av,2)
print(bv,av)
#n-tels-Punkte auf Balken verteilen:
n = input("Bitte geben Sie die Anzahl n der Unterteilungen ein: ")
n = float(n)
nx = l/n
Du solltest *niemals* nackte try/excepts benutzen. Denn die verdecken auch schlimme Programmierfehler die du beheben musst, zb wenn du dich bei einem Namen verschreibst! Du musst also unbedingt die passende Ausnahme abfangen, zB ValueError, wenn float den eingegebenen String nicht wandeln kann.
Dinge durchzunummerieren ist auch immer ein Zeichen dafuer, dass man etwas falsch macht. Entweder willst du eine Liste von Listen, oder du solltest die Listen vernuenftig benennen. Die Namenskonvention bei Python sagt auch, das GROSSGESCHRIEBENES Konstanten sein sollen. Du hast da aber keine Konstanten.
Dinge durchzunummerieren ist auch immer ein Zeichen dafuer, dass man etwas falsch macht. Entweder willst du eine Liste von Listen, oder du solltest die Listen vernuenftig benennen. Die Namenskonvention bei Python sagt auch, das GROSSGESCHRIEBENES Konstanten sein sollen. Du hast da aber keine Konstanten.
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
In diesem Fall sind's wahrscheinlich Listen mit Tupeln. Und eventuell lohnt sich auch ein Blick auf `collections.namedtupel` um den einzelnen Komponenten sinnvolle Namen geben zu können.
Die LISTEN* werden aber auch überhaupt gar nicht verwendet‽
Der `try`-Block umfasst auch viel zu viel Code. Zwischen den beiden Eingabevarianten würde man eher unterscheiden in dem man erst die Eingabezeile zerlegt (und vielleicht auch gleich in Gleitkommazahlen umwandelt) und dann anhand der Anzahl der Elemente entscheidet welchen Pfad man nimmt. Zudem werden hier auch gar keine Eingabefehler mehr behandelt, wie Eingaben die man nicht in eine Zahl wandeln kann, oder das eine falsche Anzahl von Komponenten eingegeben wird.
Das ganze sinnvoll in Funktionen aufteilen, die man dann einzeln testen kann, wäre auch nicht schlecht.
Edit: Muss man überhaupt zwischen Streckenlasten und Einzellasten unterscheiden? Kann man eine Einzellast nicht auch als Streckenlast modellieren bei der Anfang und Ende bei der Ordinate gleich sind?
Die LISTEN* werden aber auch überhaupt gar nicht verwendet‽
Der `try`-Block umfasst auch viel zu viel Code. Zwischen den beiden Eingabevarianten würde man eher unterscheiden in dem man erst die Eingabezeile zerlegt (und vielleicht auch gleich in Gleitkommazahlen umwandelt) und dann anhand der Anzahl der Elemente entscheidet welchen Pfad man nimmt. Zudem werden hier auch gar keine Eingabefehler mehr behandelt, wie Eingaben die man nicht in eine Zahl wandeln kann, oder das eine falsche Anzahl von Komponenten eingegeben wird.
Das ganze sinnvoll in Funktionen aufteilen, die man dann einzeln testen kann, wäre auch nicht schlecht.
Edit: Muss man überhaupt zwischen Streckenlasten und Einzellasten unterscheiden? Kann man eine Einzellast nicht auch als Streckenlast modellieren bei der Anfang und Ende bei der Ordinate gleich sind?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Gut an den Namen der Listen kann ich ja schnell was ändern. die Try /except schleife habe ich dort gewählt damit er in die die richtigen Listen einsortiert. Bei 3 zahlen wird der try Block ausgeführt bei 2 zahlen der except. Geht jetzt auch eher darum wie ich weiter mache. Und nein ich kann für die Schnittgrößen die Streckenlasten nicht zu Einzellasten modellieren.
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Für meinen Geschmack sind es nicht nur die Namen der Listen, sondern auch die ganzen anderen Namen die nichts über die Bedeutung der Werte verraten. Ich sehe in dem gesamten Quelltext keinen vernünftigen Namen. Einige werden auch noch für verschiedene Dinge verwendet, was es noch unübersichtlicher macht.
`try`/`except` ist keine Schleife, da wird nichts wiederholt. Und der `try`-Block wird *immer* ausgeführt, bis es zu einer Ausnahme kommt, und der `except`-Block wird bei *jeder* Ausnahme ausgeführt die irgendwo in dem zu langen `try`-Block auftritt, und nicht nur wenn nur zwei Zahlen eingegeben wurden. Zum Beispiel auch wenn mehr als 3 oder weniger als zwei Zahlen eingegeben wurden, wenn Du Dich im `try`-Block bei einem Variablennamen verschrieben hast, wenn eine Eingabe nicht in eine Zahl umgewandelt werden konnte, wenn da bei den Berechnungen irgendwo eine Division durch Null auftreten würde, wenn… tausende von Möglichkeiten die alle so behandelt werden als wenn zwei Zahlen eingegeben wurden.
Es geht eher nicht ums weiter machen, sondern darum das was da ist, erst einmal in eine vernünftige Form zu bringen.
Die `round()`-Aufrufe sind dort wo sie stehen sinnfrei. Man sollte `round()` auch nur verwenden wenn man wirklich mit einem gerundeten Wert weiter rechnen will. Nicht für die Ausgabe. Dafür gibt es bei `format()` Wege die Anzahl der angezeigten Stellen zu steuern. `round()` rundet nämlich nicht auf n Dezimalstellen sondern auf eine Zahl die dem am nächsten kommt.
`try`/`except` ist keine Schleife, da wird nichts wiederholt. Und der `try`-Block wird *immer* ausgeführt, bis es zu einer Ausnahme kommt, und der `except`-Block wird bei *jeder* Ausnahme ausgeführt die irgendwo in dem zu langen `try`-Block auftritt, und nicht nur wenn nur zwei Zahlen eingegeben wurden. Zum Beispiel auch wenn mehr als 3 oder weniger als zwei Zahlen eingegeben wurden, wenn Du Dich im `try`-Block bei einem Variablennamen verschrieben hast, wenn eine Eingabe nicht in eine Zahl umgewandelt werden konnte, wenn da bei den Berechnungen irgendwo eine Division durch Null auftreten würde, wenn… tausende von Möglichkeiten die alle so behandelt werden als wenn zwei Zahlen eingegeben wurden.
Es geht eher nicht ums weiter machen, sondern darum das was da ist, erst einmal in eine vernünftige Form zu bringen.
Die `round()`-Aufrufe sind dort wo sie stehen sinnfrei. Man sollte `round()` auch nur verwenden wenn man wirklich mit einem gerundeten Wert weiter rechnen will. Nicht für die Ausgabe. Dafür gibt es bei `format()` Wege die Anzahl der angezeigten Stellen zu steuern. `round()` rundet nämlich nicht auf n Dezimalstellen sondern auf eine Zahl die dem am nächsten kommt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Deine except`s sollten nur genau den Fehler abfangen, für den Du auch eine Lösung hast, bei Dir also der ValueError, der beim Entpacken der split-Liste auftritt, wenn keine drei Zahlen eingegeben wurde. Da aber zwei Werte nicht wirklich ein Fehlerfall sind, würde ich hier erst alles Eingegeben in Zahlen umwandeln, dann per `if len(numbers) == 3` oder == 2 prüfen, welcher Fall vorliegt und dann entsprechend weiter machen.
Er zählt jetzt aber 3 obwohl ich nur 2 Zahlen eingegeben habe... liegt das an dem Komma bei zum Beispiel der Eingabe 2,3 ?Sirius3 hat geschrieben: ↑Mittwoch 6. Juni 2018, 18:13 Deine except`s sollten nur genau den Fehler abfangen, für den Du auch eine Lösung hast, bei Dir also der ValueError, der beim Entpacken der split-Liste auftritt, wenn keine drei Zahlen eingegeben wurde. Da aber zwei Werte nicht wirklich ein Fehlerfall sind, würde ich hier erst alles Eingegeben in Zahlen umwandeln, dann per `if len(numbers) == 3` oder == 2 prüfen, welcher Fall vorliegt und dann entsprechend weiter machen.
Code: Alles auswählen
a = input("Gib deine Kräfte ein :")
print(len(a))
#Bei keiner Eingabe Schleife stoppen
if a == '':
break
#Kräfte unterteilen in Einzelast und Streckenlast
#Dabei wird geschaut ob der Benutzer zwei oder drei Angaben für a eingegeben hat und dementsprechend in die Liste einsortiert
#Bei einer Streckenlasteingabe(3 Zahlen eingegeben) wird eine try Funktion eingeleitet
if len(a) == 3:
print(len(a))
#Die Eingaben den Variabeln x1,x2,q zuordnen
x1,x2,q = a.split(",")
#Eingaben in Gleitkommazahlen umwandeln
x1 = float(x1)
x2 = float(x2)
q = float(q)
#Eingaben für spätere Schnittkraftberechnung in Listen einsortieren
LISTEq1.append(x1)
LISTEq2.append(x2)
LISTEq3.append(q)
print(LISTEq1)
print(LISTEq2)
print(LISTEq3)
#Streckenlasten in Einzellasten umrechnen für Auflagerkräfte
xn = x1
x1 = x2 - x1
q = x1 * q
xm = (x1/2)
x1 = xm + xn
#Einzellasten für spätere Auflagerberechnung in Listen einsortieren
listex1.append(x1)
listex2.append(q)
#Bei einer Einzellasteingabe (2 Zahlen eingegeben) wird eine except Funktion eingeleitet
if len(a) == 2:
#Die Eingaben den Variabeln x1,x2 zuordnen
x1,q = a.split(",")
x1 = float(x1)
q = float(q)
##Eingaben für spätere Schnittkraftberechnung in Listen einsortieren
LISTEx1.append(x1)
LISTEx2.append(x2)
#Einzellasten für spätere Auflagerberechnung in Listen einsortieren
listex1.append(x1)
listex2.append(q)