Liste wird länger und länger...

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
Saftsack
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2013, 17:22

Hey ho

Ich bin noch ziemlich neu in Python und habe ein naja nicht gerade lustiges Problem...
Ich lade Dateien von einem FTP-Server und überprüfe ob ein gewisser Wert da drinn ist. Um dies zu machen lade ich Zeile für Zeile in eine Liste rein und "zerschippsle" diese danach. Da ich nicht weiss in welcher Datei das ist, was ich suche muss ich jede Datei durchgehen. Nach dem ersten durchgang holt er sich die nächste Datei, dies funktioniert auch wunderschön. Nun kommt das Problem. Anstatt das er mir die Liste neu erstellt wird die liste einfach länger und länger... Nach dem ersten durchgang sind es 371, nach dem 2. 742...

Ich denke das Problem liegt daran das ich keine Ahnung hab wie man die Liste neu macht. Hier mal die Varianten die ich im moment in meinem Script habe :

Code: Alles auswählen

b = []
b[:] = []
while len(b) != 0 :
     b.pop()
MfG
Saftsack
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum!

Je nach Kontext sind alle drei valide, wobei 2 und 3 tatsaechlich das Listenobjekt selbst leer machen.

Zeig mal den tatsaechlichen Code, bzw den relevanten Ausschnitt.
BlackJack

@Saftsack: Die letzte Variante ist reichlich umständlich. Ich würde in der Regel die Erste vorziehen und mit einem neuen Listenobjekt beginnen statt ein Altes zu leeren.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@Saftsack: Die letzte Variante ist reichlich umständlich. Ich würde in der Regel die Erste vorziehen und mit einem neuen Listenobjekt beginnen statt ein Altes zu leeren.
Es sei denn, dass Referenzen auf exakt dieses Exemplar der Liste existieren. In dem Fall ist Variante 2 angebracht.
Saftsack
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2013, 17:22

cofi hat geschrieben:Willkommen im Forum!

Je nach Kontext sind alle drei valide, wobei 2 und 3 tatsaechlich das Listenobjekt selbst leer machen.

Zeig mal den tatsaechlichen Code, bzw den relevanten Ausschnitt.
Würde ich sehr gerne, darf es aber nicht -.-
Das Problem ist nicht das die Liste leer wird, das macht er, das Problem ist die Liste müsste gelöscht und neu gemacht werden. So das der Index wieder bei 0 ankommt.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Saftsack hat geschrieben:[...] die Liste müsste gelöscht und neu gemacht werden.
Das ist die Beschreibung für

Code: Alles auswählen

foo = []
Die Idee mit dem pop() ist amüsant zu sehen, aber sowohl von der Übersichtlichkeit wie auch von der Laufzeit her nicht wirklich schön.


Das erinnert mich an eine Routine die ein Kollege vor einigen Jahren mal verbrochen hat. Es ging darum, eine Tabelle in einer relationalen Datenbank komplett zu leeren. Dieser Vorgang kam regelmäßig vor. Die schnellste Variante war definitiv ein Löschen und Neuanlegen der Tabelle. Mit eingeschränkten Userrechten wäre ein TRUNCATE das Mittel der Wahl gewesen. Was aber hatte der Kollege sich einfallen lassen? Er selektierte alle Einträge der Tabelle um sie dann in einer Schleife durchzugehen und einzeln zu löschen. Zudem hatte er noch nach jedem Löschvorgang ein COMMIT eingebaut um bei einem möglichen Programmabbruch zumindest schon mal einen Teil der Einträge entfernt zu haben. Die Laufzeit war unterirdisch.
BlackJack

@Saftsack: Welcher Index soll wieder bei 0 ankommen? Listen haben keinen Index. Kann es sein, dass Dein eigentliches Problem eine ``for``-Schleife über eine Liste ist, die während des iterierens verändert wird, also zum Beispiel gelehrt? Das geht schlicht nicht. Der Index im Iterator ist unabhängig von der Liste und irgendwelchen Änderungen auf dem Listenobjekt. Und auch von dem oder den Namen an den die Liste gebunden ist. Das neubinden eines Namens an ein anderes Objekt hat keinen unmittelbaren Einfluss auf das Objekt welches vorher daran gebunden war und auch auf keine anderen Objekte die das alte Objekt kennen, wie beispielsweise Iteratoren.

@/me: Nur wenn diese Referenzen auch genau auf diese Liste an der Stelle auch noch Einfluss haben sollen. Genau das versuche ich in der Regel ja zu vermeiden.
Saftsack
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2013, 17:22

Index ist vielleicht das Falsche Wort. meine Liste wird 371 lang. Ich will die länge wieder auf 0 setzen bevor er die nächste Datei ausliest. Nur macht er dies nicht, nicht einmal mit dem pop() (war Notlösung, ich weiss das dies extrem unschön ist). Nur wird meine Liste danach Doppelt so lang, weil er es eifach hinten ranhängt, sprich ich hab dann 742 einträge in der Liste statt "nur" 371. Die Dateien sind auch alle gleich aufgebaut, also eines ist nicht plötzlich 342 Zeilen lang.

Das hier hab ich schon versucht, hat leider nicht geklappt^^ :

Code: Alles auswählen

 foo = []
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@saftsack: vermutlich legst du irgendwo eine Kopie der Liste an und leerst dann nur die Kopie, aber nicht die ursprüngliche Liste. Ohne den Code zu sehen kann man leider nicht sagen, wo und wie das geschieht.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@Saftsack: Wenn Du den tatsächlichen Quelltext nicht zeigen darfst, dann dampfe den doch mal solange ein, bis Du ein möglichst kleines, lauffägiges Beispiel hast, was immer noch das Problem aufweist. Vielleicht oder sogar wahrscheinlich findest Du bei diesem Prozess sogar das Problem und kannst es selber lösen. Und falls nicht können wir dann weiterhelfen ohne raten zu müssen.

Denn das einzige was wir mit Sicherheit sagen können, ist dass es sich nicht um die selbe Liste handeln kann, wenn ein ``liste[:] = []`` sie nicht leert.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@saftsack:

Code: Alles auswählen

>>> xs = [1, 2, 3, 4, 5]
>>> xs
[1, 2, 3, 4, 5]
>>> ys = xs
>>> xs = []
>>> xs
[]
>>> ys
[1, 2, 3, 4, 5]
>>> zs = list(ys)
>>> ys[:] = []
>>> ys
[]
>>> zs
[1, 2, 3, 4, 5]
In specifications, Murphy's Law supersedes Ohm's.
Saftsack
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2013, 17:22

Code: Alles auswählen

a=data.splitlines()
    b = []
    for keyValue in a:
        b.append([value.strip() for value in keyValue.split('=')])
    
    comp = ['OBJECT','GRINGPOINTLONGITUDE']
    comp2= ['OBJECT','GRINGPOINTLATITUDE']
    print b
    if comp in b:
        index =  b.index(comp)
        lon = b[index+3][1]
        
    if comp2 in b:
        index =  b.index(comp2)
        lat=b[index+3][1]
    
    

das ist alles was ich zeigen kann... dieser teil wird wieder aufgerufen, und mein b wächst und wächst, ich gebe das b nicht weiter. das einzige das weiter gereicht wird ist lat und lon...
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Saftsack: Du erstellst b ja fast direkt aus data.splitlines().
Ich würde mal vermuten, data wächst und wächst,...
Saftsack
User
Beiträge: 5
Registriert: Donnerstag 7. Februar 2013, 17:22

Sirius3 hat geschrieben:@Saftsack: Du erstellst b ja fast direkt aus data.splitlines().
Ich würde mal vermuten, data wächst und wächst,...
ich hole die datei aus einem ftp server, die wird also nicht neu abgespeichert oder so. die dateien sind alle gleichlang... ich weiss echt nicht wieso das ding mir b immer länger macht. es ist übrigens eine andere datei die aufgerufen wird beim nächsten aufruf, es kann also garnicht die selbe datei sein.


hab ja auch debug versucht^^ und hab immer mehr das gefühl ich bin zu dämlich oder so^^

Code: Alles auswählen

 test1 = len(b)
    b = []
    test2 = len(b)
wenn ich test1 ausgeben lasse gibt er mir 377, nach b=[] sagt er bei test2 0.. wenn die methode neu aufegrufen wird sagt er mir bei test 1 754 und bei test 2 wieder 0. das ganze wiederholt sich, wobei test1 jedesmal um 377 wächst.
wenn es so weiter geht werd ich wieder auf c++ umsteigen -.- kann ja net sein...
BlackJack

@Saftsack: Bei dem gezeigten Quelltext kann, wie Sirius3 schon angemerkt hat, nur `data` immer länger werden. Lass Dir doch mal dessen Länge beziehugsweise die von `a` ausgeben.

Ansonsten wäre ein lauffähiges Beispiel praktisch an dem wir das Problem nachvollziehen können.
Antworten