doppelte Listen aus 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
tasel
User
Beiträge: 2
Registriert: Donnerstag 4. April 2019, 12:59

Hallo zusammen,

ich habe ein Programm, das mir im Rahmen einer for-Schleife Wertepaare von zwei Integers ausgibt, wie viele ist allerdings unbekannt. Diese stecke ich als einzelne Listen in eine Liste. Am Ende möchte ich dass aus dieser Liste alle Listen mit den gleichen Elementen entfernt werden, allerdings ohne Beachtung der Reihenfolge. Außerdem soll die Zweierpaarung erhalten bleiben und am Ende wieder eine Liste ergeben.

Meine Idee war die Unterlisten zu sortieren und dann über list(set(...)) die doppelten zu entfernen. Zweiteres gibt leider den Fehler unhashable type: 'list' aus. Gibt es dazu Alternativen oder hat jemand eine Idee wie das optimalerweise sogar ohne Schleife funktioniert?

Code: Alles auswählen

import numpy as np
J=[[1,3],[0,3],[3,1],[4,5]]  #nur ein Beispiel wird eigentlich deutlich länger
for i in range(np.shape(J)[0]):
    J[i]=sorted(J[i])
    #list(set(J)) 
    
 #Ziel in diesem Beispiel wäre eine der beiden Listen [[1,3],[0,3],[4,5]] oder [[0,3],[3,1],[4,5]]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst die Paare in ein Tupel ueberfuehren. Das kann als Schluessel benutzt werden. Du solltest ausserdem davon absehen, deine Ursprungs-Datenstruktur J zu ueberschreiben. In Python (und generell wenn es geht) legt man NEUE Datenstrukturen an. Denn durch das rumfummeln an einer Datenstruktur entstehen die wundervollsten Fehler. Nicht umsonst gibt es eine ganze Klasse von Programmiersprachen (die funktionalen), die keine Veraenderung von Zustand erlauben.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn die Reihenfolge der zweier-Paare egal ist, mußt Du die inneren Listen in ein frozenset packen und die äußere in ein set:

Code: Alles auswählen

unique = set(map(frozenset, J))
Das ganze kann man bei Bedarf auch wieder in Listen umwandeln:

Code: Alles auswählen

unique = list(map(list, unique))
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich habe da gerade eine Dejavu: Elemente aus Listen-Unterliste löschen. Nicht mal 'ne Woche her… :-)
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
tasel
User
Beiträge: 2
Registriert: Donnerstag 4. April 2019, 12:59

Sirius3 hat geschrieben: Montag 8. April 2019, 16:14

Code: Alles auswählen

unique = set(map(frozenset, J))
unique = list(map(list, unique))
Danke, das war genau das was ich gesucht habe
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da gibt's auch was von Ratio…, äh, in `more_itertools`:

Code: Alles auswählen

In [8]: J
Out[8]: [[1, 3], [0, 3], [3, 1], [4, 5]]

In [9]: list(more_itertools.unique_everseen(J, frozenset))
Out[9]: [[1, 3], [0, 3], [4, 5]]
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten