Spaltensumme

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
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Hallo ich will die Summen der einzelnen Spalten herausfinden. Aber ich komme nicht weiter.
Mein Code:

Code: Alles auswählen

datei = "C:\\Users\\***\\Pythontest\\uebung.txt"

total = 0

with open( datei, 'r' ) as eingabe:
    for spalte in eingabe:     
        inhalt = spalte.split("Enter")  
        for hiohio in range( 0, 3):
            num = int(inhalt[hiohio])
            total += num
        print("Summe der Zeile: " + str(total) )
        total = 0[
uebung.txt sieht so aus:
12 23 55
5 6 7
8 98 5412

Beispiel:
12+5+8 =25, Die Summe für die 1. Spalte würde 25 ergeben.
und noch eine Frage, durch was werden die Spalten getrennt?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@SerBlack: bei Dir werden die Spalten durch das Wort "Enter" getrennt, was ziemlich seltsam ist. Über Listen iteriert man direkt und nicht über einen Index. Variablen initialisiert man bevor man sie braucht und nicht, nachdem man damit fertig ist. Für Summen gibt es auch die sum-Funktion. Und wo kommst Du nicht weiter? Was für Gedanken hast Du Dir schon gemacht?
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

So habe es jetzt etwas verbessert:

Code: Alles auswählen

datei = "C:\\Users\\***\\Pythontest\\uebung.txt"

total = 0

with open( datei, 'r' ) as eingabe:
    for spalte in eingabe:     
        inhalt = spalte.split("\t")  
        for hiohio in range( 0, 3):
            num = int(inhalt[1])
            num = int(inhalt[1])
            num = int(inhalt[1])
            total += num
        print("Summe der Spalte: " + str(total) )
BlackJack

@SerBlack: Gute Namen sind wichtig. Das erleichtet es dem Leser nicht nur ein Programm leichter zu verstehen, sondern es hilft dem Programmierer auch zu sehen ob er das Problem richtig verstanden hat, und ob die Lösung korrekt ist. Darum ist es sehr ungünstig nichtssagende Fantasienamen oder gar *falsche* Namen zu verwenden. Was zum Henker soll `hiohio` bedeuten? Und warum nennst Du *Zeilen* `spalte`?

Was denkst Du was die Zeilen 9 bis 11 bewirken? Warum wird `hiohio` in der Schleife nicht verwendet? Dann braucht man keine Schleife, dann könnte man `num` auch einfach mit 3 multiplizieren.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Code: Alles auswählen

with open( datei, 'r' ) as eingabe:
    for zeile in eingabe:     
        inhalt = zeile.split("\t")  
        print( inhalt )
        for index in range( 0, len(inhalt) ):
            num = int(inhalt[index])
            total += num
        print("Summe der Zeile: " + str(total) )
        total = 0
So, verständlicher? (Hier werden aber nur die einzelnen Zeilen addiert, aber wie addiert man die Spalten?)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@SerBlack: besser so

Code: Alles auswählen

with open(datei, 'r') as eingabe:
    for zeile in eingabe:    
        inhalt = zeile.split("\t")  
        print(inhalt)
        total = 0
        for spalte in inhalt:
            num = int(spalte)
            total += num
        print("Summe der Zeile: {}".format(total))
Überleg Dir mal in einem ersten Schritt, wie Du die Summe über die erste Spalte berechnen könntest.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

So, habe mir etwas überlegt:

Code: Alles auswählen

with open( datei, 'r' ) as eingabe:
    for zeile in eingabe:     
        inhalt = zeile.split("\t")  
        print( inhalt )
        total = 0
        for index in range( 0, len(inhalt) ):
            num = int(inhalt[0])
            num = int(inhalt[1])
            num = int(inhalt[2])
            total += num
        print("Summe der Zeile: " + str(total) )
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@SerBlack: kannst Du auch schreiben, was Du Dir dabei überlegt hast? Was macht die innere for-Schleife? Wofür wird index verwendet?
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Index ist dafür da:(früher hiohio) Er zählt wie viele Einträge es gibt (im uebung.txt Ordner, so habe ich es verstanden)
Und er greift auf die Einträge zu. (Lerne Python durch so eine Seite, also so habe ich es verstanden)
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@SerBlack:
Damit wenigstens das Ergebnis stimmt, solltest du die Werte direkt aufaddieren:

Code: Alles auswählen

total = 0
for index in range( 0, len(inhalt) ):
    total += int(inhalt[0])
    total += int(inhalt[1])
    total += int(inhalt[2])
    print(total)
Dieses Vorgehen über den Index ist jedoch unüblich (zumal du hier den Index gar nicht verwendest und das auch als Schleife hier komplett sinnlos ist, ehrlich gesagt). Besser gehst du direkt über die Werte:

Code: Alles auswählen

total = 0
for wert in zeile.split('\t'):
    total += int(wert)
print(total)
Und wenn man schon etwas weiter in Python ist, würde man das eher so schreiben:

Code: Alles auswählen

total = sum(int(wert) for wert in zeile.split('\t'))
Oder noch kürzer so:

Code: Alles auswählen

total = sum(map(int, zeile.split('\t'))
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Oh, man merkt dass ich noch nicht lange wache bin. Es sind ja Spaltensummen gefragt. Daher muss man den Code natürlich noch anpassen. Wahrscheinlich würde ich zunächst zeilenweise die Umwandlungen machen und dann zip() benutzen:

Code: Alles auswählen

with open(dateiname) as infile:
    parsed_lines = [map(int, line.split('\t')) for line in infile]
column_sums = [sum(column) for column in zip(*parsed_lines)]
print(column_sums)
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Oh, danke funktioniert ...
Könntest du mir eventuell erklären, wie du das gemacht hast, natürlich wenn du Zeit und Bock hast? Verstehe nämlich nichts (außer die ersten Zeilen).
Danke für die Hilfe ;)

Dies ist ein sehr kleiner Schritt für die Menschheit, aber ein gewaltiger Sprung für SerBlack.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@snafu: Wir wissen, dass Du es kannst :wink:

Aber jetzt hat SerBlack zwei Probleme:
- er versteht noch nicht, warum sein Code nicht funktioniert
- und er versteht noch nicht, warum Dein Code funktioniert.

@SerBlack: Gehe noch einmal zu Deinem Posting von heute morgen und die Fragen von Sirius3 zurück und versuche zu erklären was Dein Programmcode tatsächlich tut. Am besten Zeile für Zeile. Bevor Dir das nicht klar ist und Du zumindest hinlänglich Schleifen und Datenstrukturen in Python verstanden hast, wird es Dir nicht gelingen nachzuvollziehen, was snafu da geschrieben hat.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Code: Alles auswählen

datei = "C:\\Users\\***\\Pythontest\\uebung.txt"
with open(datei, 'r') as eingabe:
    for zeile in eingabe:    
        inhalt = zeile.split("\t")  
        print(inhalt)
        total = 0
        for spalte in inhalt:
            num = int(spalte)
            total += num
        print("Summe der Zeile: {}".format(total))
1. Zeile: Ort, wo das Datei liegt, wird als "Datei" gekürzt.
2. Zeile: Öffnen der Datei, wird als "eingabe" gekürzt.
3. Zeile: (Hier verstehe ich nicht ganz was for bewirkt, aber ich auf der Seite stand, ich soll dies schreiben, da wurde es auch erklärt habe es aber nicht verstanden)
4. Zeile: Die Zeilen werden getrennt (Wo ein Tabulator zu finden ist) und wird als "Inhalt" gekürzt.
5. Zeile: Die getrennten Zeilen werden ausgegeben (also print)
6. Zeile: Total ist auf 0.
7. Zeile: (verstehe immer noch nicht was for bewirkt)
8. Zeile: num ist gleich Zahl(also int)
9. Zeile: (hier verstehe ich nicht warum += genommen wurde)
10. Zeile: Die Summe der Zeile wird ausgegeben.

(Sry, bin ein sehr sehr blutiger Anfänger, lerne Python seit einigen Tagen)
BlackJack

@SerBlack: Was Du „gekürzt“ nennst würde man eher als „Werte an Namen binden“ oder „zuweisen“ nennen. Ob der Wert ausgeschrieben länger oder kürzer als der Name ist, hat damit nichts zu tun. Bei ``total = 0`` ist der geschriebene Wert ja beispielsweise länger als der Name.

Wenn Du ``for`` nicht verstehst, dann solltest Du es verstehen lernen, entweder mit dem Tutorial das Du verwendest, oder falls das nicht hilft in einem anderen. Aber am besten nicht gleich mit Dateiobjekten, sondern beispielsweise mit Listen, weil man damit etwas einfacher in der interaktiven Python-Shell selber etwas experimentieren kann um es zu verstehen.

In der Python-Dokumentation gibt es zum Beispiel ein Tutorial.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Hallo SerBlack,

vielleicht solltest du dich erst einmal ein bisschen in die Funktion von for-Schleifen einlesen. Ich habe gute Erfahrungen mit diesem Python 3 - Tutorial gemacht.

zu 9.)
+= bedeutet so viel wie "addiere zu dieser Zahl hinzu", also ist

Code: Alles auswählen

zahl += 5
das selbe wie

Code: Alles auswählen

zahl = zahl + 5
Da du ja die Summe bilden willst, musst du diese Zahlen aufaddieren.
SerBlack
User
Beiträge: 41
Registriert: Freitag 31. März 2017, 11:45

Okay, danke
Werde mir jetzt mal Tutorial's reinziehen.
Bis irgendwann mal
Antworten