Liste der einzigartigen Multi-Sets abrufen

8

Wie kann ich die folgende Liste in Python auflösen:

%Vor%

Gewünschte Ausgabe ist:

%Vor%

d. Ich muss Tupel loswerden, die die gleichen Nummern haben, aber in anderer Reihenfolge.

Ich habe es versucht

%Vor%

aber es transponiert nur Elemente.

Und wenn ich das tue

%Vor%

die Dinge werden nur schlimmer:

%Vor%

Mit anderen Worten, ich muss das innere Tupel in eine Sammlung konvertieren, die mehrere gleiche Elemente erlaubt ( set ist nicht geeignet) und für die Permutationen von Elementen die Sammlung selbst nicht ändern (ähnlich wie C ++% co_de) %)

    
tsionyx 29.04.2014, 05:50
quelle

6 Antworten

5

Wie wäre es damit:

%Vor%

Ausgabe:

%Vor%

Es wird jedoch die Reihenfolge jedes Tupels beeinträchtigen. Ich gehe davon aus, dass das egal ist, da Tupel, die denselben Zahlensatz enthalten, in Ihrem Fall als gleich angesehen werden. Was dies impliziert, ist, dass die Ausgabeliste am Ende Tupel enthalten kann, die nicht zur ursprünglichen Eingabe gehören (zum Beispiel an @thefourtheye):

%Vor%

Das kann oder kann kein Problem sein, und wenn es ist, können Sie die robusteren Lösungen verwenden, die bereits in den anderen ausgezeichneten Antworten erwähnt werden.

    
YS-L 29.04.2014, 05:55
quelle
3

Verwenden Sie collections.Counter () , um die eindeutigen Multisets zu identifizieren:

%Vor%     
Raymond Hettinger 29.04.2014 05:55
quelle
2

Wenn die Reihenfolge nicht wichtig ist, können Sie dies verwenden

%Vor%

Wenn Sie die Bestellung bearbeiten möchten,

%Vor%

In beiden Lösungen verlassen wir uns auf frozenset , weil die set Objekte nicht hashbar sind, da sie veränderbar sind. Im ersten Fall konstruieren wir ein Wörterbuch mit der Häufigkeit der Zahlen (bestimmt mit Counter ) als Schlüssel und dem aktuellen Tupel als dem entsprechenden Wert. Sobald die Wörterbuchkonstruktion abgeschlossen ist, nehmen wir alle Werte, die den Tupeln entsprechen.

Im zweiten Fall verwenden wir einfach OrderedDict , um die Reihenfolge beizubehalten.

    
thefourtheye 29.04.2014 06:01
quelle
1

Kann das sein?:

%Vor%     
mshsayem 29.04.2014 05:56
quelle
1

Versuchen Sie

%Vor%

oder

%Vor%     
Kei Minagawa 29.04.2014 07:25
quelle
0

Ich nehme an, dass Sie zwei Elemente als "gleich" betrachten, wenn sie unabhängig von der Reihenfolge dieselben Werte enthalten.

Sie können also jedes Tupel "kanonisieren", indem Sie es sortieren, zurück in Tupel konvertieren (also hashbar sind) und Duplikate mit set wieder entfernen:

%Vor%

Sie können auch die ursprüngliche "äußere" Reihenfolge beibehalten, indem Sie OrderedSet anstelle von set verwenden.

    
shx2 29.04.2014 05:52
quelle