Python selbst erstellte Klassensortierung

Motivation

Python verfügt über eine Sortierfunktion, einschließlich einer list.sort () -Methode und einer sortierten () -Funktion. Ich suchte nach Sortierungen für meine eigene Klasse. Das ist es! Ich konnte so etwas nicht finden, also werde ich es als Memorandum belassen.

Weise

Laut Official Dies kann durch Angabe einer Tastenfunktion erfolgen. Außerdem scheint es, dass dies auch durch Überladung von Klassenvergleichsoperatoren erfolgen kann.

Beispiel mit Vergleichsoperator

Nach dem Studium machte ich ein Kartenspiel Wie man aus der Trump-Klasse sortiert Zuerst dachte ich darüber nach, den Vergleichsoperator zu überladen. (C ++ Programmierergefühl)

Wenn es eine Trump-Klasse mit so einem Ruß und solchen Zahlen gäbe (Ein Teil des Codes wird weggelassen)

class Trump:
    def __init__(self, suit, number):
        self.suit = suit
        self.number = number

Definiert eine Vergleichsoperatorüberladung in der Trump-Klasse.

    def __lt__(self, other):
        """Vergleichsoperator<"""
        return self.get_sort_number() < other.get_sort_number()

    def __gt__(self, other):
        """Vergleichsoperator>"""
        return self.get_sort_number() > other.get_sort_number()

get_sort_number () definiert die Reihenfolge der Anordnung durch die Größe der int-Nummer. Es ist ein Bild, bei dem das kleinere an erster Stelle steht. In Bezug auf Ruß ist die Reihenfolge Spaten, Herz, Diamant, Keule und Joker. Bei get_sort_number () addieren Sie die Nummer des Rußes (Trump.SORT_ ~) und die Nummer, Ich bekomme die Zahlen zu sortieren.

    def get_sort_number(self):
        """Holen Sie sich eine Ganzzahl zum Sortieren"""
        n = 0
        if self.suit == Trump.SPADE:
            n = Trump.SORT_SPADE
        elif self.suit == Trump.HEART:
            n = Trump.SORT_HEART
        elif self.suit == Trump.DIAMOND:
            n = Trump.SORT_DIAMOND
        elif self.suit == Trump.CLUB:
            n = Trump.SORT_CLUB
        elif self.suit == Trump.JOKER:
            n = Trump.SORT_JOKER
        #Gibt eine Nummer mit Sortierung und hinzugefügten Nummern zurück
        return n + self.number

Übrigens werde ich die numerische Definition der Sortierung setzen Die Zahl für jeden Ruß ist 13, es muss also nicht 20 sein, aber es ist gut durch 20 getrennt. Wenn 13 Spaten Die Zahl, die von get_sort_number () übernommen werden kann, ist 0 + 13 und 13 Wenn es eines der Herzen ist Die Zahl, die von get_sort_number () übernommen werden kann, ist 20 + 1 und 21 Es wird sein. Die Sortierung erfolgt nach der Größe dieser Nummer.

    SORT_SPADE = 0
    SORT_HEART = 20
    SORT_DIAMOND = 40
    SORT_CLUB = 60
    SORT_JOKER = 80

Definieren Sie eine TrumpHand-Klasse, die diese Trumps zusammenbringt. (Nicht unbedingt erforderlich) Sie haben einfach die Trump-Klasse in der Liste. Beim Sortieren müssen Sie lediglich die Sortiermethode der Liste aufrufen. Es wird in aufsteigender Reihenfolge ohne Erlaubnis sortiert.

class TrumpHand:
    def __init__(self):
        self.hand = []

    def sort(self):
        """Sortieren Sie Ihre Hand"""
        self.hand.sort()

Lass uns das machen (Die Erklärung zum Hinzufügen und Drucken entfällt ~~ Sie können sich nur den Namen ~~ vorstellen)

    #Handklasse generieren(Ich habe es nur in der Liste)
    hand = trump_hand.TrumpHand()
    #Fügen Sie Ihrer Hand 1 Joker und Club sowie 1 Spaten hinzu
    hand.add(trump.Trump(trump.Trump.JOKER, 1))
    hand.add(trump.Trump(trump.Trump.CLUB, 1))
    hand.add(trump.Trump(trump.Trump.SPADE, 1))
    #Geben Sie den Status vor dem Sortieren aus
    hand.print()
    #Sortieren
    hand.sort()
    #Geben Sie den Status nach dem Sortieren aus
    hand.print()

Dies ist die Ausgabe vor dem Sortieren. J1 (Joker), C1 (Club 1), S1 (Spade 1) und die im obigen Code hinzugefügte Reihenfolge.

[0]J1
[1]C1
[2]S1

Dies ist die Ausgabe nach dem Sortieren. S1 (1 Spaten), C1 (1 Club), J1 (Joker) Und get_sort_number () sind in der genauen Reihenfolge, die in der Erklärung angegeben ist.

[0]S1
[1]C1
[2]J1

Problem

Es war kein Happy End ...

Problem 1

Ist es in Ordnung, Trumps Vergleichsoperatoren in Sortierreihenfolge zu verwenden? Der Vergleichsoperator kann auch verwendet werden, um die Stärke von Trump zu vergleichen.

Problem 2

Abhängig von den Spielregeln kann sich die Stärke abhängig von den Bedingungen ändern Oder ich möchte, dass es für Benutzer leicht zu sehen ist. Ist es nicht schwierig, beim Reparieren flexibel zu sein?

Ein anderer Weg

Hier kommt endlich das Sortieren mit der Tastenfunktion ins Spiel. ~~ Official wurde bereits geschrieben, sodass Sie sich diesen Artikel nicht ansehen müssen ~~ ~~ Aber ich habe es nicht sofort verstanden ~~

Zitiert vom Beamten

list.sort () und sorted () haben Schlüsselparameter. Dies ist ein Parameter, der die Funktion angibt, die für jedes Element der Liste aufgerufen werden soll, bevor ein Vergleich durchgeführt wird. Der Schlüsselparameter muss ein einzelnes Argument annehmen und den zum Sortieren verwendeten Schlüssel zurückgeben. Diese Einschränkung ermöglicht eine schnellere Sortierung, da die Tastenfunktion für jeden Eingabedatensatz genau einmal aufgerufen wird.

Weise

Sie wissen, dass Sie die Funktion zum Sortieren in der Schlüsselfunktion angeben können. Die Frage ist, wie man eine Schlüsselfunktion macht.

Wenn Sie sich die Formel genau ansehen ** Ein gängiges Verwendungsmuster besteht darin, ein aus mehreren Elementen bestehendes Objekt anhand eines der Indizes als Schlüssel zu sortieren. ** **.

Diesmal wird wahrscheinlich get_sort_number () erwähnt. Geben Sie einen Schlüssel zurück, der aus einem Ruß und einem Zahlenelement besteht. Lassen Sie ihn sortieren, fertig. Wenn beim Sortieren in aufsteigender Reihenfolge die Zahl niedrig ist, sollte sie am Anfang stehen, und wenn sie hoch ist, sollte sie am Ende stehen.

Schreiben Sie den Code neu, indem Sie sagen. ** (Hinweis) Es wird empfohlen, trump.Trump.get_sort_number anzugeben, das unter dieser Methode steht **

Vor dem Umschreiben

    def sort(self):
        """Sortieren Sie Ihre Hand"""
        self.hand.sort()

Nach dem Umschreiben (Lambda-Ausdruck)

    def sort(self):
        """Sortieren Sie Ihre Hand"""
        self.hand.sort(key=lambda x: x.get_sort_number())

Geben Sie beim Aufrufen der Sortiermethode die Funktion Key mit key = an. Dieses Mal wird get_sort_number () des Sortierziels (Trump-Klasse) zurückgegeben und zum Sortieren verwendet. Als Randnotiz ist x die Trump-Klasse.

Außerdem ist die oben beschriebene Überladung des Vergleichsoperators nicht erforderlich. Löschen Sie sie. Ich habe es im Lambda-Stil geschrieben, aber wenn ich es normal schreibe, wäre es so. (Nicht überprüft)

#Schlüsselfunktionsdefinition irgendwo
def get_sort_key(x):
    return x.get_sort_number()

    #Sortierung umschreiben(Geben Sie die Tastenfunktion an)
    def sort(self):
        """Sortieren Sie Ihre Hand"""
        self.hand.sort(key=get_sort_key)

Empfohlene Methode

2020/04/19 18:00 Nachtrag Dies wird empfohlen, da die Programmabsicht klarer ist als @shiracamus (Operation überprüft). Danke für deinen Kommentar

Vor dem Umschreiben

    def sort(self):
        """Sortieren Sie Ihre Hand"""
        self.hand.sort()

Nach dem Umschreiben (trump.Trump.get_sort_number in der Schlüsselfunktion angeben)

    def sort(self):
        """Sortieren Sie Ihre Hand"""
        self.hand.sort(key=trump.Trump.get_sort_number)

Dies passiert, wenn Sie die Version ausführen, die die Schlüsselfunktion angibt.

Ausgabe vor dem Sortieren

[0]J1
[1]C1
[2]S1

Ausgabe nach dem Sortieren

[0]S1
[1]C1
[2]J1

Ja, es hat die gleiche Ausgabe wie der Vergleichsoperator. Wenn Sie die Spezifikation der Tastenfunktion entsprechend der Situation und den Spezifikationen ändern, können Sie flexibel sortieren.

~~ Reue ~~

~~ Python wurde erst vor ein paar Tagen gestartet, es tut mir leid, wenn etwas nicht stimmt ~~ ~~ Die Trump-Klasse kann durch Bitoperation in eine Variable eingefügt werden, aber der Klarheit wird Priorität eingeräumt ~~ ~~ get_sort_number () Du kannst es kürzer schreiben ~~

Recommended Posts

Python selbst erstellte Klassensortierung
[Python] Sortieren
Python #sort
[Python] -Klasse, Instanz
"Kanrika" die Python-Klasse
Über Python, Klasse
Python-Klasse, Instanz
# Python-Grundlagen (Klasse)
Python-Syslog-Wrapper-Klasse
Python-Klasse (Python-Lernnotiz ⑦)
Fallklasse in Python
Blasensortierung in Python
[Python] Klassenvererbung (super)
Grundmethode der [Python] -Klasse
[Python] Klassenvererbung, überschreiben
[Memo] Python 3-Listensortierung
Python-Subprozess-Wrapper-Klasse
Python-Spickzettel
Benutzerdefinierte Sortierung in Python3
[Python] Sammlungstypen sortieren
YOLO Python-Wrapper-Klasse
Klassennotation in Python
Liste der Python-Ausnahmeklassen
x86-Compiler selbst erstellt mit Python
Python: Klassen- und Instanzvariablen
[Python] Laden von selbst erstellten mehrstufigen Modulen
Sortieren Sie den Pfad natürlich in Python
C / C ++ - Programmierer fordert Python heraus (Class Edition)
Python Basic Dikt Sortierreihenfolge
Sortieren Sie große Dateien mit Python
Zusammenfassung des Bereichs der Python-Klassenmitglieder
Absteigende Sorte mit Mongodb in Python
Python-Klassen- und Instanzvariablen
Python-Anfänger organisieren Blasensorten
Sortieren nach Datum in Python
Über Python sort () und reverse ()
[Python] Zufällige Verarbeitung (erstellen, auswählen, sortieren)
Perl-Objekt und Python-Klasse Teil 2.
Python
[Hikari-Python] Kapitel 09-03 Klasse (Vererbung)
In Python-Klassenvariablen versteckte Landminen
Python-Klassendefinitionen und Instanzbehandlung
"Die einfachste Python-Einführungsklasse" geändert
Lesen Sie PNG-Chunks in Python (Klassenausgabe)
Klasse
[Python] Weg zur Serpent (3) Python-Klasse
Sortieren Sie große Textdateien in Python
[Python] Einzeilige Starlin-Sortierung mit 50 Zeichen
Untersuchen Sie die Klasse eines Objekts mit Python
Perl-Objekt und Python-Klasse Teil 1.
Logistische Regressionsanalyse Selbst erstellt mit Python
Klasse
[Python] Erbt eine Klasse mit Klassenvariablen
Sortieren
Wenn Sie mehrere Schlüssel in Python-Sortierung angeben
Was ist neu in Python 3.9 (2) -Sortierte nicht verteilte Diagramme in Python
Erstellen Sie mit Class einen Python-Funktionsdekorator
[Einführung in Python] Wie verwende ich eine Klasse in Python?
[Lernnotiz] Grundlagen des Unterrichts mit Python