2016-07-19 18 views
0

Python Anfänger. Wie präsentiere ich Daten aus einer Datei und berechne Gesamt/Durchschnitt für jede Person? Wie füge ich den Wert einer Variablen außerhalb von für in jeder Iteration hinzu, und wenn die Iteration vorbei ist, dividiere sie durch die Anzahl der Datensätze?Durchschnitt und Summe aus Datei berechnen

Die Daten in der Datei ändert, da kann der Benutzer Daten hinzufügen und löschen, aber die Daten wie folgt strukturiert:

PersonA;342;454;559; 
PersonB;444;100;545; 
PersonC;332;567;491; 
PersonD;142;612;666; 

Ich will vorhanden es wie folgt aus:

PersonA 342 454  559 TOTAL AVERAGE 
PersonB 444 100  545 TOTAL AVERAGE 
PersonC 332 567  491 TOTAL AVERAGE 
PersonD 142 612  666 TOTAL AVERAGE 

Was kann Ich schreibe danach, um es richtig zu machen?

def show_result(): 
    text_file = open('result.txt', 'r') 

    for line in text_file: 
     if ';' in line: 
      line2 = line.split(";") 
     print line2 

?

with open("input.txt") as f: 
    for line in f: 

s = """PersonA;342;454;559; 
PersonB;444;100;545; 
PersonC;332;567;491; 
PersonD;142;612;666;""" 

for line in s.split("\n"): 
    p, a, b, c, _ = line.strip().split(";") 
    print("{}\t{}\t{}\t{}\t{}\t{}".format(p, a, b, c, 
     sum([int(a), int(b), int(c)]), 
     sum([int(a), int(b), int(c)])/3)) 

Lösung:

def show_result(): 
    text_file = open('minigolf.txt', 'r') 

    print "Name,Round1,Round2,Round3" 
    for line in text_file: 
     if ';' in line: 
      line2 = line.split(";")[:-1] 
     print line2 

     line_total = sum(map(int, line2[1:])) 
     line_average = line_total/len(line2[1:]) 
     print "Total: ", line_total 
     print "Average: ", line_average 
+0

Wie werden insgesamt und durchschnittlich für jede Person berechnet? Meinst du den Gesamt/Durchschnitt der Spalten 2, 3 und 4? –

Antwort

0

Zur Berechnung der total Sie können einfach nicht (vorausgesetzt, dass Sie nicht wollen, den ersten Index enthalten, die als "Persona" enthält, etc.):

line_total = sum(map(int, line2[1:])) 

Von dort ist der Durchschnitt auch einfach:

line_average = line_total/len(line2[1:]) 

Erläuterung:

  • Die sum Funktion in einem iterable nimmt (für unsere Zwecke denken Sie an eine iterable als Liste) und alle Inhalte die entsprechende Summe-Funktion hinzufügt.

  • Die [1:] wird Listenspleißen genannt. Mit dieser Syntax sagen Sie Python, dass Sie eine neue Liste mit dem Inhalt der ursprünglichen Liste erstellen möchten, beginnend mit der Position 1. Hier ein paar Beispiele:

    >>> a = [1, 2, 3] 
    >>> b = [1:] 
    >>> b 
    [2, 3] 
    

Die spezifische Syntax lautet wie folgt: [start_index : end_index] entweder die start_index oder die end_index kann leer gelassen werden und Python wird sie jeweils mit dem Beginn oder Ende der Liste füllen.

+0

Beachten Sie, dass die Eingabe Strings und keine Ints ist. –

+0

Aber wie würde das aussehen zusammen mit dem Code, den ich geschrieben habe, denn jetzt bekomme ich einen Fehler: Datei "C: \ Benutzer \ HKI \ Desktop \ test3.py", Zeile 32, in show_result line_total = sum (map (int, line2 [1:])) ValueError: ungültiges Literal für int() mit Basis 10: '' –

2
s = """PersonA;342;454;559; 
PersonB;444;100;545; 
PersonC;332;567;491; 
PersonD;142;612;666;""" 

for line in s.split("\n"): 
    p, a, b, c, _ = line.strip().split(";") 
    print("{}\t{}\t{}\t{}\t{}\t{}".format(p, a, b, c, 
     sum([int(a), int(b), int(c)]), 
     sum([int(a), int(b), int(c)])/3)) 

Ausgang:

PersonA 342  454  559  1355 451.6666666666667 
PersonB 444  100  545  1089 363.0 
PersonC 332  567  491  1390 463.3333333333333 
PersonD 142  612  666  1420 473.3333333333333 

Edit:

Wenn Sie aus einer Datei lesen möchten, können Sie dies tun:

with open("input.txt") as f: 
    for line in f: 
     # same as above: split the line, etc. 
+0

Aber erhält dies die Daten aus einer Datei? Die Daten werden in result.txt wie PersonA; 342; 454; 559; –

+0

Ja, es ist einfach, Zeilen aus einer Datei zu lesen. –

+0

Meine Erklärung könnte ein wenig unklar sein. Da der Benutzer Daten in result.txt löschen und hinzufügen kann, existiert PersonA möglicherweise nicht, aber PersonQ könnte einmal, aber nicht die nächste. Wie bekomme ich die Daten aus der Datei, bekomme sie in verschiedene Zeilen und berechne Gesamt/Durchschnitt, wenn ich nicht weiß, welche Personen von Zeit zu Zeit in der Datei existieren? –

0

dies, wie ich tun würde, . Allerdings gibt es viele Möglichkeiten, dies in Python zu erledigen.

import pandas as pd 

df = pd.read_csv('result.txt', sep=';',header=None) 
del df[4] 
df['AVERAGE'] = df[[1,2,3]].mean(axis = 1) 
df['TOTAL'] = df[[1,2,3]].sum(axis = 1) 

Ich benutze pandas Bibliothek für diese Art von Operationen.

Ausgang:

0   1  2  3  AVERAGE  TOTAL 
0 PersonA  342  454  559  451.666667 1355 
1 PersonB  444  100  545  363.000000 1089 
2 PersonC  332  567  491  463.333333 1390 
3 PersonD  142  612  666  473.333333 1420 
0

Dies wird für alle Werte pro Person arbeiten, und für eine beliebige Anzahl von Personen:

from collections import defaultdict 

def myprint(lines): 
    sum_dict = defaultdict(lambda: ([], 0, 0)) 

    for line in lines: 
     data = line.strip().split(";") 
     person = data[0].strip() 
     values = [int(i) for i in data[1:] if i] 
     sum_dict[person] = (values + sum_dict[person][0], sum(values)+sum_dict[person][1], len(values)+sum_dict[person][2]) 

    for person in sorted(sum_dict): 
     values, total, nb = sum_dict[person] 
     print "{}\t{}\t{}\t{}".format(person, '\t'.join([str(i) for i in values]), total, total/nb) 

if __name__ == '__main__': 

    import os 
    if os.path.exists('result.txt'): 
     with open('result.txt') as input: 
      lines = input.readlines() 
    else: 
     s = """PersonA;342;454;559; 
       PersonB;444;100;545; 
       PersonC;332;567;491; 
       PersonD;142;612;666;""" 
     lines = s.split('\n') 

    myprint(lines) 
Verwandte Themen