x.remove([a, b]) Funktioniert nicht?

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
drtebi
User
Beiträge: 7
Registriert: Donnerstag 10. April 2003, 17:09
Wohnort: Madrid

Hallo,
sorry wenn das eine einfache newbie Frage ist, aber ich kapier es nicht:

Text file:

Code: Alles auswählen

gudrun:1052235700
schabanak:1014850400
teset:1054936800
stop:232342342
32days:1049407200
haaaaa:290923092
hello:1049407200
Python script:

Code: Alles auswählen

#!/usr/bin/python

# import modules
import string
from time import time
from sys import exit

# open flat file database
try:
  fp = open('free_subs.db', 'r+')
except IOError:
  print 'Error opening file'
  exit(1)

# read data
entries = []
for line in fp:
  tokens = string.split(line, ':', 1)
  if(len(tokens) > 1):
    entries.append([tokens[0], string.rstrip(tokens[1])])

# create minimum timestamp (timestamp one month ago)
minimum = int(time() - 2592000)

# find overdue users
users_overdue = []
for user, since in entries:
  if int(since) < int(minimum):
    users_overdue.append(user)
    entries.remove([user, since])
    

print entries
print users_overdue
it returns:

Code: Alles auswählen

[['gudrun', '1052235700'], ['teset', '1054936800'], ['32days', '1049407200'], ['hello', '1049407200']]
['schabanak', 'stop', 'haaaaa']
aber es sollte sein:

Code: Alles auswählen

[['gudrun', '1052235700'], ['teset', '1054936800']
['schabanak', 'stop', '32days', 'haaaaa', 'hello']
Wenn ich die line entries.remove([user, since]) weglasse, bekomme ich zumindest die richtige users_overdue list, aber wieso klappt das entries.remove([user, since]) nicht??
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Du darfst die Liste, über die Du in der for-Schleife iterierst nicht innerhalb des Schleifenblocks gleichzeitig kürzen. Denn wenn Du einen Listeneintrag löschst, liefert die Schleife bei nächsten Mal nicht das nächste, sondern das übernächste Element, überspringt also eins.
Ein etwas übersichtlicheres Beispiel:

Code: Alles auswählen

liste = range(1,10)
for i in liste:
	print i,
	if not i%3:	liste.remove(i)
Ausgabe: 1 2 3 5 6 8 9
Also besser mit einer 2. Liste arbeiten.

Jan

Nachtrag: Wohl eleganteste Lösung:
for user, since in entries[:]:
So arbeitet for auf einer Kopie von entries.
drtebi
User
Beiträge: 7
Registriert: Donnerstag 10. April 2003, 17:09
Wohnort: Madrid

super,
danke. Habe mir schon fast gedacht dass das was damit zutun hatte dass ich die liste innerhalb der schleife veränder... und hatte schon mit dem Gedanken gespielt ich müsste eine zweite Liste benutzen.

Nun werde ich aber mal die eleganteste Lösung propieren :wink:

Vielen Dank,
DrTebi
Antworten