Nehmen wir an, ich habe zwei set()
s:
a = {('1', '2', '3', 'a'), ('1', '2', '4', 'a'), ('1', '2', '5', 'b')}
b = {('1', '2', '3', 'b'), ('1', '2', '4', 'b'), ('1', '2', '6', 'b')}
Was ich jetzt tun möchte, ist, den eingestellten Unterschied zu finden, b \ a
aber das letzte Element aus jedem Tupel zu ignorieren. Es ist also so, als würde man so etwas machen:
a = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '5')}
b = {('1', '2', '3'), ('1', '2', '4'), ('1', '2', '6')}
In[1]: b - a
Out[1]: {('1', '2', '6')}
Erwartete Ausgabe:
b \ a = {('1', '2', '6', 'b')}
Gibt es eine offensichtliche / pythonische Möglichkeit, dies zu erreichen, ohne jeden Satz manuell durchlaufen und mit jedem vergleichen zu müssen tuple[:3]
?
python
python-2.7
set
Grajdeanu Alex.
quelle
quelle
set
und überschreiben Sie die Differenzoperation. Es gibt keine sofort einsatzbereite Lösung, die mir bekannt ist, und ich bezweifle, dass es eine gibt.aa = { t[:3] for t in a }
tuple
und überschreiben Sie den DifferenzoperatorAntworten:
So können Sie Ihre eigene Klasse schreiben, um das normale Hashing-Verhalten eines Tupels zu überschreiben:
mit Ausgabe
Um das Verhalten von Tupelgruppen zu ändern, müssen wir das Hashing von Tupeln ändern.
Von hier ,
Also, um das Hashing ignoriert das letzte Element zu machen, müssen wir die dunder Methoden überlasten
__eq__
und__hash__
angemessen. Dies ist nicht so schwierig, da wir nur das letzte Element abschneiden und dann an die entsprechenden Methoden eines Normalen delegieren müssentuple
.Weiterführende Literatur:
quelle
:)
. In Wirklichkeit geht es nur darum, Teile der Operatorüberladung zu kombinieren und wie Hashing in Python funktioniert.Hier ist ein Ansatz, der Listen anstelle von Mengen definiert
a
undb
verwendet, da mir die einfachste Lösung die Indizierung impliziertb
:quelle
Sets funktionieren gut. Es sind Ihre Daten, die nicht richtig funktionieren. Wenn sie unterschiedlich aussehen, aber tatsächlich gleich sind, definieren Sie einen Datentyp, der sich wie gewünscht verhält. Dann funktioniert das Set von alleine großartig.
quelle
__repr__
und__hash__
in Form von Tupeln, aber nicht__eq__
. Wäre es nicht kürzer, auch hier Tupel zu verwenden? Tatsächlich können Sie hier und in Slicing verwenden__hash__
, um den Code weiter zu verkürzen.