Ranking

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
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Naja..Wieder ein Problem. Diesmal das Ranking. Ich hab eine Datei die sieht in etwa so aus:
[['1', ['zugrunde gehen', 'umkommen']]]
[['1', ['herangehen', 'auf sich nehmen', 'erdulden']]]
[['1', ['hineingehen', 'beginnen']]]

Ich will in mein tolles Programm, jede Zeile einzeln einlesen und die Punkte (1) pro key (z.B.'zugrunde gehen', 'umkommen') addieren.
Also dachte ich mir mal die Zeichen kürzen ([]') und ein dictionary erstellen und mit has_key prüfen...
Aber irgendwie funktioniert das nicht.
Hier mein Ansatz:

Code: Alles auswählen

f = open("false.txt","r")
y = {}
x = 0
inh = len(f.readlines())
f.close()
f = open("false.txt","r")
while x <= inh:
     line = f.readline()
     u = line.strip("[")
     u = line.strip("]")
     u = line.strip("'")
     print u
     u = u.split('#')
     translation = u[1]
     point = u[0]
     if y.has_key(translation):
          z = y[point]
          z = z.rstrip("'")
          y[translation] = int(z) + point
          del z
     else: y.update({translation:point})
     x += 1
f = open("ranking.txt","aU")
f.write(y)
f.close()
Fehlermeldung:
Traceback (most recent call last):
File "ranking.py", line 17, in ?
translation = u[1]
IndexError: list index out of range
[/python]
joe

hi!
marco_ hat geschrieben:

Code: Alles auswählen

     u = u.split('#')
     translation = u[1]
 
Deine beispielzeilen enthalten kein #, also landet alles komplett in u[0].
BTW: Der Code ist schon ziemlich strange!
joe
BlackJack

Ich kann mich joe nur anschliessen: sehr komischer und wohl auch falscher Quelltext.

Du liest eine Datei komplett ein um die Zeilenanzahl zu erfahren und tust dann damit nichts wirklich Vernünftiges. Mit allen Zeilen einer Datei der Reihe nach etwas anstellen sieht in Python so aus:

Code: Alles auswählen

lines = open('spam.txt')
for line in lines:
   # Do something with `line`.
lines.close()
Das ``del z`` ist überflüssig. Speicher wird automatisch freigegeben wenn das Objekt nicht mehr über irgendeinen Namen erreichbar ist. Die einzige Verwendung für ``del`` hatte ich in den Jahren, in denen ich nun schon Python verwende, nur um Einträge aus Dictionaries zu löschen. Und einmal um einen Slice aus einer Liste zu entfernen. Aber nie für einfache Namen.

Die Verwendung von `update()` im ``else``-Zweig ist ziemlich obskur. Was spricht gegen ``y[translation] = point``? Der übliche Quelltext für das Eintragen/Addieren sähe so aus:

Code: Alles auswählen

y[translation] = y.get(translation, 0) + point
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

@BlackJack: dezent OT-Frage:
Wenn ich ein größeres Objekt habe und das per del object lösche, wird der Speicher dann freigegeben oder bleibt er in der GC bis der Interpreter beendet ist?

mfg, querdenker
BlackJack

Man kann mit ``del`` keine Objekte löschen! Man entfernt damit nur einen Namen für ein Objekt. Alles andere wäre auch fatal. Mal angenommen man hat folgenden Quelltext:

Code: Alles auswählen

a = Spam()
b = a
# ...
del a
print b
Wenn ``del`` wirklich das Spam Objekt löschen würde, was sollte dann bei dem ``print`` passieren!? Den Namen `b` gibt es ja noch.

Wenn alle Namen für ein Objekt gelöscht wurden, dann ist das Objekt selbst zum löschen freigegeben. Wann genau das passiert, wird von Python nicht garantiert.

Bei CPython wird ein Referenzzähler für jedes Objekt verwaltet und sobald der letzte Name verschwindet, wird auch das Objekt beseitigt und bei Jython ist der normale JVM-GC verantwortlich, und der macht keine Garantien wie lange es vom verschwinden der letzten Referenz bis zum löschen dauert.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Danke

mfg, querdenker
Antworten