Seite 1 von 1

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

Verfasst: Dienstag 6. Mai 2003, 21:12
von drtebi
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??

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

Verfasst: Dienstag 6. Mai 2003, 21:54
von Voges
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.

Verfasst: Dienstag 6. Mai 2003, 22:17
von drtebi
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