Werte zusammenfassen problem

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

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
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke an alle es funktioniert.
Antworten