Seite 1 von 1

Werte zusammenfassen problem

Verfasst: Montag 9. August 2010, 11:47
von mit
Hallo,
das folgende Skript:

Code: Alles auswählen

def createDataset():
  step = 5000
  limit = step
  summary = 0
  
  fileName = "/media/disk/s/test.txt"
  for line in open(fileName):
    line = line.rstrip()
    currentPos = int(line)
    if (currentPos <= limit):
      summary += 1
      #print(str(currentPos) + " " + str(summary))
    elif (currentPos > limit):
      print(str(limit) + " " + str(summary))
      summary = 0           
      limit += step
      if (currentPos < limit):
        #print("+++" + str(currentPos)) 
        summary += 1

createDataset()
liest diese Datei ein:

Code: Alles auswählen

3612	
3989	
4064	
4683	
4894	
4994	
5281	
8588	
8991	
9122	
9171	
9237	
9374	
10233	
21113	
21606	
21724	
23403	
23406	
25326	
25349	
25976	
26051	
26088	
26214	
27112	
27160	
29301	
39539
Das Skript sollte folgendes ausgeben:

Code: Alles auswählen

5000 6	
10000 7	
15000 1	
20000 0
25000 5
30000 9
35000 0	
40000 1
Leider bekomme ich folgende fehlerhafte Ausgabe:

Code: Alles auswählen

5000 6
10000 7
15000 1
20000 0
25000 4
30000 9
35000 0
40000 0
Wie könnte ich die Werte zählen und alle 5000 ausgeben wie viele in diesem Bereich legen?

P.S. Sollte es keine Werte im einem Bereich geben wie z.B. zwischen 15000 und 20000 dann soll dieser Bereich eine 0 bekommen.

Vielen Dank im Voraus.

Re: Werte zusammenfassen problem

Verfasst: Montag 9. August 2010, 12:28
von cofi
Wenn ich das richtig sehe, liegen beide Fehler daran, dass du nicht solange hochzaehlst bis dein Wert wieder "gueltig" ist.

Code: Alles auswählen

def createDataset():
  step = 5000
  limit = step
  summary = 0
 
  fileName = "/media/disk/s/test.txt"
  for line in open(fileName):
    line = line.rstrip()
    currentPos = int(line)
    if (currentPos <= limit):
      summary += 1
      #print(str(currentPos) + " " + str(summary))
      continue
    while (currentPos > limit):
      print(str(limit) + " " + str(summary))
      summary = 0
      limit += step
    #print("+++" + str(currentPos))
    summary += 1

Re: Werte zusammenfassen problem

Verfasst: Montag 9. August 2010, 12:31
von jbs
Allgemein: PEP-8 beachten, keine Klammern nach einem if oder elif, print innerhalb der Funktion ist unschön, da du ja nachher das Ergebnis eher zurückgeben willst.

Nutze doch eine while Schleife, die überprüft, ob die Zeile innerhalb des limits ist.

Code: Alles auswählen

data = map(int, lines)
step = 5000
limit = step
result = [[limit, 0]]

for i in data:
    while i > limit:
        limit += step
        result.append([limit, 0])
    else:
        result[-1][1] += 1
    
print result

Re: Werte zusammenfassen problem

Verfasst: Montag 9. August 2010, 13:17
von ntrunk
Was die Fehlerursache betrifft, stimme ich cofi zu. Außerdem wird die letzte ermittelte Summe niemals ausgegeben, da fehlt noch ein print nach Verlassen der Schleife.

Mein Lösungsvorschlag:

Code: Alles auswählen

def createDataset(step, filename):
  # Die Summen werden in eine Liste geschrieben
  summary = []
  for line in open(filename):
    # Listenindex abhaengig von step berechnen
    index = int(line.rstrip())/step
    # Falls der Listeneintrag noch nicht existiert => erzeugen
    if len(summary) <= index:
      summary += [0] * (index-len(summary)+1)
    # und die Summe hochzaehlen
    summary[index] += 1
  return summary

step,filename = 5000,'/media/disk/s/test.txt'
for i,value in enumerate(createDataset(step, filename)):
  print (i+1)*step, value

Re: Werte zusammenfassen problem

Verfasst: Dienstag 10. August 2010, 12:38
von mit
Danke an alle es funktioniert.