Seite 1 von 1

Problem mit Listen

Verfasst: Dienstag 11. November 2008, 10:25
von spinneratz
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:

Verfasst: Dienstag 11. November 2008, 10:34
von .robert
ungetestet:

Code: Alles auswählen

for i in relsdata:
    if i not in relsselected:
         relsdata.remove(i)

Verfasst: Dienstag 11. November 2008, 10:36
von Darii
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.

Geht nicht

Verfasst: Dienstag 11. November 2008, 10:38
von spinneratz
hallo,
bei letzterer Variente wird alles gelöscht,
bei ersterer wird einer der Einträge der übereintimmen würde gelöscht.

Verfasst: Dienstag 11. November 2008, 10:43
von spinneratz
Problem ist das aus relsdata - liste nur der erste Eintrag verglichen werden soll

Problem gelöst

Verfasst: Dienstag 11. November 2008, 11:06
von spinneratz
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

Verfasst: Dienstag 11. November 2008, 15:12
von DasIch
Das continue ist an der Stelle überflüssig.

Verfasst: Dienstag 11. November 2008, 15:26
von BlackJack
@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.