Listen berechnung

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.
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

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
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

zipped = zip(Meter, Kräfte)
zipped = list(zipped)
print (zipped)
>>>[(0, 2), (1, 4), (2, 8), (3, 8), (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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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]
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist übrigens der Grund, warum man zusammengehörige Werte nicht in getrennten Listen speichern sollte. Woher kommen die Zahlen und warum stehen sie in zwei Listen?
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

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.
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
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.
When we say computer, we mean the electronic computer.
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

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
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__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?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

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.
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

In Ordnung. Und was wäre eine Alternative Möglichkeit zu der try/except Schleife ? Für mich ist es aber gerade eh wichtiger Erstmal das Programm auch wenn mit Fehlern, zum laufen zu bringen.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

perfekt danke
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

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.
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
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeig den Code, den Du versucht hast, sonst kann man dazu nichts sagen.
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

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)
ich glaube len funktioniert in dem fall nicht. weil wenn ich zum beispiel 23,45 eingebe hab ich ein len von 5. Gibt es da nicht eine funktion die zählt wieviele zahlen eingeben wurden
illyalarm
User
Beiträge: 12
Registriert: Dienstag 5. Juni 2018, 20:11

Sirius3 hat geschrieben: Mittwoch 6. Juni 2018, 18:37 Zeig den Code, den Du versucht hast, sonst kann man dazu nichts sagen.
ja
Antworten