Problem mit Listen

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
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

Dienstag 11. November 2008, 10:25

Hallo ich habe ein Problem mit Listen:
ersteinmal mein Code:

Code: Alles auswählen

for r in relsdata:
   try: relsselected.index(r[0])
   except: 
       index = relsdata.index(r)
       del relsdata[index]
ich habe zwei Listen: relsdata und relsselected.

Inhalt von relsdata:
[('ULRICH.REL0', 'ULRICH.BCVALS', 'ULRICH.ND3', 'BCID', 'OBJECTID', 'IDDDDD'), ('ULRICH.REL00', 'ULRICH.BCVALS', 'ULRICH.ND3', 'BCID', 'OBJECTID', 'IDDDDD'), ('ULRICH.ND3_REL', 'ULRICH.BCVALS', 'ULRICH.ND3', 'BCID', 'OBJECTID', 'BCVALID'), ('ULRICH.Nodes311_3_RELNOCOPY', 'ULRICH.BCVALS', 'ULRICH.Nodes311_3', 'BCID', 'OBJECTID', 'IDDDDD')]

Inhalt von relsselected:
['ULRICH.REL0', 'ULRICH.REL00']

Jetzt sollen aus relsdata alle Einträge gelöscht werden in denen die Einträge aus relsselected nicht vorkommen.
Bei meinem Code von oben ist das Problem, dass die Schelife verlassen wird, wenn ein Fehler geworfen wird, und somit nicht mehr weiter gesucht wird, ob es noch weitere Eintäge gibt, die nicht übereinstimmen.
Weiß jemand wie man in der Schleife weitersuchen kann, bzw. wie man den Code umgestalten könnte, damit der Fehler nicht mehr auftritt?

Wäre echt sehr nett wenn mir jemand helfen könnte - bin am verzweifeln! :cry:
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Dienstag 11. November 2008, 10:34

ungetestet:

Code: Alles auswählen

for i in relsdata:
    if i not in relsselected:
         relsdata.remove(i)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Dienstag 11. November 2008, 10:36

Wenn dann lieber so:

Code: Alles auswählen

for i in relsdata[:]:
    if i not in relsselected:
         relsdata.remove(i)
Es ist keine gute Idee, Elemente aus der Liste zu löschen, über die man iteriert.
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

Dienstag 11. November 2008, 10:38

hallo,
bei letzterer Variente wird alles gelöscht,
bei ersterer wird einer der Einträge der übereintimmen würde gelöscht.
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

Dienstag 11. November 2008, 10:43

Problem ist das aus relsdata - liste nur der erste Eintrag verglichen werden soll
spinneratz
User
Beiträge: 23
Registriert: Freitag 31. Oktober 2008, 15:41

Dienstag 11. November 2008, 11:06

Hallo,
habe das Problem gelöst.
Wen es interessiert:

Code: Alles auswählen

for i in relsdata[:]:
    if i[0] not in relsselected:
        print "Remove: " + str(i)
        relsdata.remove(i)
        continue
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dienstag 11. November 2008, 15:12

Das continue ist an der Stelle überflüssig.
BlackJack

Dienstag 11. November 2008, 15:26

@spinneratz: Ich würde eine neue Liste ohne die unerwünschten Elemente aufbauen. Durch das `remove()` bekommt Dein Vorgehen eine quadratische Laufzeit.

Code: Alles auswählen

relsdata = [d for d in relsdata if d[0] not in relsselected]
Falls `relsselected` auch mal länger sein kann, könnte man das in ein `set()` stecken, dann ist der Test auf "enthalten sein" schneller.
Antworten