Print von Objekt rückgabe

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
Riebers
User
Beiträge: 9
Registriert: Sonntag 18. Juni 2017, 18:52

Hi Leute,

ich habe eine Klasse geschrieben, die Werte einer Liste sortieren soll. Das tut sie auch. Jedoch wenn ich ein Objekt der Klasse erzeuge möchte ich das diese mir die sortierte Liste zurück gibt. Wenn man normal print() nutzt wird nur die Adresse des Objekts zurück geliefert. Weiß einer wie ich das ändern kann?!

Code: Alles auswählen

class Sort:
    def __init__(self,Liste):
        self.__Liste=Liste
        self.get_sortedList()
        
    def get_sortedList(self):
        for j in range(len(self.__Liste)-1):
            for i in range(len(self.__Liste)-1):
                if self.__Liste[i]>self.__Liste[i+1]:
                    tmp=self.__Liste[i]
                    self.__Liste[i]=self.__Liste[i+1]
                    self.__Liste[i+1]=tmp
        return self.__Liste
    
if __name__ == "__main__":
    
    Liste=[21,3,1,123,6,434,346,643,6,7,8,1]
    x=Sort(Liste)
    print(x)
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte orientier dich bei der Code-Gestaltung an PEP8. Bezeichner von Variablen werden klein geschrieben, Klassen bekommen CamelCase, Methoden nur Kleinbuchstaben und Unterstriche, nicht gemischt mit CamelCase. Der doppelte Unterstrich macht nicht was du denkst, und sollte vermieden werden.

Ganz allgemein wuerde man das Problem so nicht loesen. Deine Klasse ist keine Klasse, weil sie eigentlich schon alles bei Konstruktion macht, und danach als Objekt wertlos ist. Darum wuerde da eine Funktion vollkommen ausreichen. Die wiederum ihr Ergebnis gleich zurueckgibt, womit dein Problem auch verschwindet.

Weswegen es die schon eingebaute Sortierfunktionalitaet von Python die Funktion sorted ist, und die Methode sort() auf Listen None zurueck gibt, statt der sortierten Liste, um anzuzeigen "ich habe mich selbst modifiziert" .

Gibt es einen Grund, warum du das Rad neu erfindest, insbesondere mit einem so schlechten Algorithmus wie Bubblesort?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Riebers: doppelte Unterstriche sind nur dazu da, um bei tiefen Vererbungshierarchien keine Konflikte zu bekommen. Da die Liste etwas öffentliches ist, sollte sie gar keinen Unterstrich haben. Bei `get_sortedList` würde man erwarten, dass man eine sortierte Liste bekommt, aber das ändert auch die Liste. Zusätzlich ist überraschend, dass die an Sort übergebene Liste auch verändert wird. Auch, dass die Liste schon beim Erstellen der Klasse sortiert wird, es aber noch eine öffentliche Methode get_sortedList gibt, ist verwirrend. Insgesamt ist die Klasse eigentlich überflüssig. Der Sortieralgorithmus ist überragend ineffizient.

Was Du statt dessen sinnvoller machen kannst, um Klassen zu üben, wäre eine Klasse, die sich wie eine Liste verhält, aber beim Hinzufügen eines Elements, dieses gleich an die richtige sortierte Position einfügt. Um das effizient zu machen, böte sich das bisect-Modul an.

Um die Ausgabe bei `print` zu steuern, mußt Du die Methode __str__ definieren.


@__deets__: das ist kein Bubble-Sort sondern etwas viel schlechteres.
Antworten