alle Elemente einer Liste, die in einer anderen Liste vorkommen, löschen

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
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Hallo,

ich danke euch schon mal im Voraus für eure Hilfe, ich weiß echt nicht weiter und weiß auch nicht wie ich nach sowas googeln soll :D

und zwar möchte ich liste mit liste2 vergleichen und dazu soll das Programm alle Elemente in "Liste 2", die identisch sind mit den Elementen in "Liste 1" aus "Liste1" entfernen.
Bsp:

Code: Alles auswählen

liste2 = [["1"],["2"],["3"]] 
liste = [["2"],["2"],["1"],["4"],["3"]]

for n in liste2:
    print(n)
    for n1 in liste:
        print(n1)
        if n == n1:
            print("true") #wenn true dann remove
            table.remove(n1)
            #Schrittzah vonl n1 = [n1-1]  - dieser Schritt wäre notwendig. aber wie?
        else:
            print("false")
            
print(table)


Rauskommen soll also Liste = ["4"]; rauskommen tut's aber Liste = [["2"],["4"]]

Nun habe ich beim Debuggen bemerkt, dass es zwar genau das macht, was ich will, nämlich jedes einzelne Element von Liste2 mit jedem einzelnen Element von Liste vergleichen, allerdings, wenn es ein Element aus Liste löscht, merkt sich das Programm die Schrittzahl und macht bei dieser weiter(siehe oben)... Notwendig wäre also hier, dem Programm zu sagen, dass es jedes mal, wenn es ein Element aus der Liste löscht, die Schrittzahl um 1en Schritt zurücksetzt.

Meine Frage ist: Wie soll man das bewerkstelligen?


Danke nochmals an alle :)

Viele Grüße,

Illy
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Praktischerweise erstellt man einfach eine neue Liste mit den passenden Elementen.
Zudem ist die Variante über alle Elemente in der Vergleichsliste zu iterieren zu komplex. Da reicht auch ein `if element in liste` bzw. hier ein `if element not in liste`. Mit einer List Comprehension wird das dann zu einem Einzeiler.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum bestehen die Elemente der Listen aus Listen mit genau einem Element? Woher kommen die?
`n` und `n1` sind schechte Variablennamen. `table` ist nirgends definiert.
Statt eine Liste zu verändern, erzeugt man in python eine neue Liste.

Code: Alles auswählen

newlist = [element for element in list if elenent is not in list2]
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

Sry, die daten habe ich aus einem anderen Datenset, ich habe die Variablen einfach gändert, table ist in dem Fall "Liste".. Aus einer Liste, weil, dort wo das Programm eingesetzt werden soll, Listen in einer Liste vorkommen , deshalb hatte ichs auch table genannt.
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

ich werdes ausprobieren, danke :)
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich würde dafür aus Effizienzgründen lieber ein Set nehmen. Falls die Reihenfolge erhalten bleiben soll:

Code: Alles auswählen

other = set(other_items)
new = [item for item in items if item not in other]
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

snafu hat geschrieben: Samstag 26. Oktober 2019, 15:23 Ich würde dafür aus Effizienzgründen lieber ein Set nehmen.
Natürlich würde man ein Set nehmen, aber lass den Fragesteller doch erst mal ankommen. :D
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@snafu: set geht nicht wegen der Listen.
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sirius3 hat geschrieben: Samstag 26. Oktober 2019, 15:39 @snafu: set geht nicht wegen der Listen.
Seit wann das nicht? Das Set dient in dem Fall dem effizienteren Testen auf Vorhandensein innerhalb der anderen Liste. Siehe mein weiter oben geposteter Beispielcode.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ging noch nie. unhashable type: 'list'
Benutzeravatar
snafu
User
Beiträge: 6867
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Bei Listen in Listen trifft das zu. Diese einelementrigen Listen aus dem Beispiel ergeben für mich aber wenig Sinn. Dann kann man ja auch gleich den Inhalt nehmen für das Set oder eben eine Umwandlung in ein Tupel vornehmen (falls es in Wirklichkeit doch mehr Elemente sind).
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

also ich habe folgendes ausprobiert, bitte korrigiert, wenn das falsch ist, da bei der Befehl in den eckigen Klammern nicht funktioniert(und ich wusste es nicht anders umzusetzen ausser wie folgt):

Code: Alles auswählen


liste2 = [["1"],["2"],["3"]] 
liste = [["2"],["2"],["1"],["4"],["3"]]

for element in liste: 
    if element != liste2:
        newliste = element
print(newliste)
Hat aber nicht geklappt, er gibt mir nur ["3"] heraus. Was eigentlich gar nicht sein sollte.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst ja auch an eine Liste ANHAENGEN. So wie du es machst weist du nur element dem Namen newliste zu. Du musst also eine neue Liste newliste am Anfang anlegen, und dann eben anhaengen.
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

ausserdem @snafu, ich muss diese einelementige listen in der liste lassen. Das hier ist nur ein Beispiel in meiner Testdatei. Wenn das Problem gelöst wird, wird das auf ein anderes Programm übertragen.
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

ahso also newlist=[] und dann append befehlt, thx, ich probiers
illy1
User
Beiträge: 26
Registriert: Montag 21. Oktober 2019, 20:24

ok hat jetzt anscheinend funktioniert, dankeschön!

Aber ich musste tatsächlich "not in" benutzen, warum klappt das nicht mit "!=" ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil das was anderes ist? Ein roter Ball ist entweder in einem Baellebad, oder er ist nicht in einem Baellebad. Aber ein roter Ball ist nicht das gleiche wie ein Baellebad.
Antworten