Seite 1 von 1

doppelte Listen aus Liste entfernen

Verfasst: Montag 8. April 2019, 13:14
von tasel
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]]

Re: doppelte Listen aus Liste entfernen

Verfasst: Montag 8. April 2019, 13:27
von __deets__
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.

Re: doppelte Listen aus Liste entfernen

Verfasst: Montag 8. April 2019, 16:14
von Sirius3
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))

Re: doppelte Listen aus Liste entfernen

Verfasst: Dienstag 9. April 2019, 10:21
von __blackjack__
Ich habe da gerade eine Dejavu: Elemente aus Listen-Unterliste löschen. Nicht mal 'ne Woche her… :-)

Re: doppelte Listen aus Liste entfernen

Verfasst: Dienstag 9. April 2019, 11:31
von tasel
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

Re: doppelte Listen aus Liste entfernen

Verfasst: Dienstag 9. April 2019, 11:45
von __blackjack__
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]]