Listeneinträge aus einer anderen Liste entfernen

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
Angi
User
Beiträge: 1
Registriert: Montag 27. Juli 2020, 16:16

Hallo,

ich würde gerne aus einer Liste die aus Tupels besteht z.B. [("Marmelade", "rot", ...]] bestimmte Einträge löschen. Diese Einträge sind in einer Liste mit Zahlen z.B. ["1", "2", ..] , die die Position der Tupels, die entfernt werden sollen festgehalten.
Ich habe schon vieles probiert, wie zum Beispiel liste.pop(int(auswahl), allerdings werden höchstens zwei richtige Einträge entfernt.

Vielen Dank im Vorhinein für Ihre Hilfe.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum sind die Zahlen Strings?
Was hast Du versucht? Zeige den Code dazu? Was ist das Ergebnis und wie weicht das vom erwarteten Ergebnis ab?
Statt Elemente aus einer Liste zu Löschen erzeugt man in Python normalerweise eine neue Liste, die die zu löschenden Elemente einfach nicht mehr enthält.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Angi hat geschrieben: Montag 27. Juli 2020, 16:26 Ich habe schon vieles probiert, wie zum Beispiel liste.pop(int(auswahl), allerdings werden höchstens zwei richtige Einträge entfernt.


Klar, denn nach dem Entfernen von Elementen verschieben sich ja die Positionen der Nachfolger entsprechend nach vorne und somit passt die erwartete Zuordnung nicht mehr.

Es ist besser, stattdessen mit enumerate() zu arbeiten:

Code: Alles auswählen

items = [("Marmelade", "rot"), ("Käse", "gelb"), ("Gurke", "grün")] 
ignore_indices = [1, 2]
result = [item for (i, item) in enumerate(items) if i not in ignore_indices]
print(result)
Vermutlich ist die Aufgabe aber sowieso leichter mit dem externen pandas-Modul lösbar. Dazu einfach mal nach "python pandas" recherchieren...
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

snafu hat geschrieben: Dienstag 28. Juli 2020, 05:14 Vermutlich ist die Aufgabe aber sowieso leichter mit dem externen pandas-Modul lösbar. Dazu einfach mal nach "python pandas" recherchieren...
Anmerkung: Mir ist aufgefallen, dass sich die Anfänger auf Pandas stürzen, Magie anwenden, aber nicht wissen wie man das dann mit Python macht. Spätestens wenn man mit "dreckigen" Daten arbeiten will, ist die Logik von Pandas ganz angenehm, vor allem wenn es um das Parsen von csv geht. Mit dem csv-modul muss man viel zu Fuß machen.

Als Generator:

Code: Alles auswählen

def ignore(sequence, *ignored):
    for idx, element in enumerate(sequence):
        if idx not in ignored:
            yield element


items = [("Marmelade", "rot"), ("Käse", "gelb"), ("Gurke", "grün")] 
ergebnis = list(ignore(items, 0, 1))
Andersherum ist es sogar etwas einfacher, da dies bereits in operator.itemgetter implementiert ist.

Code: Alles auswählen

import operator

items = [("Marmelade", "rot"), ("Käse", "gelb"), ("Gurke", "grün")] 
getter = operator.itemgetter(0, 2) # holt sich die indicies 0 und 2

ergebnis = getter(items)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten