liste sortieren in python ohne sort funktion

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
claudia
User
Beiträge: 6
Registriert: Sonntag 14. November 2021, 20:45

Hallo an ALLE,
ich komme alleine leider nicht mehr weiter.
Ich habe vor , eine Liste zu sortieren ohne die sort() Funktion und das Minimum und Maximum zu erhalten auch ohne min oder max Funktion zu benutzen.
Die Funktionen laufen, aber jede für sich alleine . Ich habe keine Ahnung wo mein Denkfehler ist.


def selectionSort(Liste):
n = len(Liste)
if n==0:
return None
#print("Zeille 13: Die laenge von A ist :",n)
for i in range (0,n-1):
for j in range (i+1,n):
if Liste[j]<Liste:
Liste,Liste[j]=Liste[j],Liste

Liste = input().split()
selectionSort(Liste)
print( Liste)


def maximum(Liste):
Max=Liste[0]
Min=Liste[0]
for k in Liste:
if k >Max:
Max=k
if k<Min:
Min=k
return( Min,Max)

#Liste=[-1,2, 12,3,4 ,9]
Min,Max=maximum(Liste)
#maximum(Liste)
IndexMin=Liste.index(Min)
IndexMax=Liste.index(Max)
print("Maximum" ,Max)
print("Minimum" ,Min)
print("Index von Minimum",IndexMin,"Index von Maximum",IndexMax)



DANKE
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@claudia: Wenn Du Quelltext in Code-Tags in den Beitrag setzt, dann bleibt die Einrückung in der Anzeige des Beitrags erhalten und ein kleines „i“ in eckigen Klammern wird nicht als „ab hier Text kursiv“ interpretiert.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Funktionen werden üblicherweise nach der Tätigkeit benannt die sie durchführen. `maximum` ist keine Tätigkeit und zusätzlich auch noch ein Namen der für das Ergebnis, beziehungsweise einen der beiden Ergebniswerte sehr passend wäre. Zudem vermutet sicher niemand bei einer Funktion die `maximum()` heisst, das sie neben dem Maximum auch das Minimum ermittelt.

`k` ist kein guter Name für ein allgemeines Element aus einer Liste/Sequenz.

Die Verteilung von Leerzeichen sieht teilweise ein bisschen zufällig aus, das sollte sauberer passieren. Die Reihenfolge von der Behandlung und Ausgabe von Minimum und Maximum könnte man auch einheitlicher gestalten.

Wenn eine Funktion einen expliziten Rückgabewert hat, dann sollte sie in jedem Fall einen expliziten Rückgabewert haben. `selection_sort()` hat aber nur im Fall das die Liste leer ist ein explizites `None` als Rückgabewert. Sonst ein implizites `None`. Also eigentlich gar keinen (sinnvollen) Rückgabewert, also sollte in dem ``if``-Zweig auch nur ``return`` stehen, ohne das `None`.

Letztlich ist die ``if``-Abfrage aber auch überflüssig. Die kann man einfach weglassen und die Funktion macht immer noch genau das gleiche. Wenn die Liste leer ist, dann wird auch die erste ``for``-Schleife nicht durchlaufen, weil ein ``range(0, -1)`` gar keine Zahlen liefert.

Die 0 als erstes Argument bei dem `range()` kann man sich sparen.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3


def selection_sort(elemente):
    length = len(elemente)
    for i in range(0, length - 1):
        for j in range(i + 1, length):
            if elemente[j] < elemente[i]:
                elemente[i], elemente[j] = elemente[j], elemente[i]


def get_min_and_max(elemente):
    minimum = maximum = elemente[0]
    for element in elemente:
        if element < minimum:
            minimum = element
        if element > maximum:
            maximum = element
    return (minimum, maximum)


def main():
    elemente = input().split()
    selection_sort(elemente)
    print(elemente)
    # elemente = [-1, 2, 12, 3, 4, 9]
    minimum, maximum = get_min_and_max(elemente)
    min_index = elemente.index(minimum)
    max_index = elemente.index(maximum)
    print("Minimum:", minimum)
    print("Maximum:", maximum)
    print("Index von Minimum:", min_index, " Index von Maximum:", max_index)


if __name__ == "__main__":
    main()
Man könnte `get_min_and_max()` noch so ändern, dass es nicht nur mit Listen/Sequenztypen funktioniert, sondern allgemein mit jedem iterierbaren Objekt. Und falls man so etwas in realem Code braucht, gäbe es das schon fertig im externen `more_itertools`-Modul. Das hat dann auch wie die eingebauten `min()` und `max()`-Funktionen ein `key`- und ein `default`-Argument.

Mir ist jetzt nicht so ganz klar was Dein Problem ist? Was funktioniert hier jetzt nicht so wie Du erwartest?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
claudia
User
Beiträge: 6
Registriert: Sonntag 14. November 2021, 20:45

Hallo , vielen Dank für deine Hilfe.
Ich wollte den Index zusätzlich haben wo das Min und Max in der original Liste waren bevor ich sie sortiert habe.
Bsp : [1 2 5 9 -1] dann ist das Minimum an der Stelle 4 und Max an der Stelle 3.

Sorry , ich denke habe mich sehr schlecht ausgedruckt.
Für deine Ratschläge bin sehr Dankbar, denn ich kann nur davon lernen.

Danke
Liebe Grüsse
Claudia
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@claudia: Na dann ermittle das doch einfach vor dem sortieren. Und effizienter wäre es sich eine Funktion zu schreiben die die Indizes ermittelt, statt erst die Extremwerte zu ermitteln und die dann *noch mal* linear in der Liste zu suchen.

Und noch der Hinweis das es so ganz allgemein nicht *das* Maximum/Minimum in der Liste geben muss, weil Werte ja mehrfach vorkommen können. Auch das Maximum/Minimum. Im Extremfall haben alle Elemente den gleichen Wert.

Über den Fall der leeren Liste müsstest Du dann vielleicht auch noch nachdenken, was da passieren soll.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
claudia
User
Beiträge: 6
Registriert: Sonntag 14. November 2021, 20:45

@_blackjack_: Ja, super Idee . Auf die Idee bin gar nicht gekommen. Jetzt klappt es .DANKE Danke !!!!

def get_min_and_max(elemente):
if len(elemente)==0:
return None
minimum = maximum = elemente[0]

for element in elemente:
if element < minimum:
minimum = element
indexMinimum=elemente.index(minimum)
if element > maximum:
maximum = element
indexMaximum=elemente.index(maximum)
if element==minimum==maximum:
minimum=maximum=element
indexMinimum=indexMaximum=elemente.index(minimum)
return (minimum, maximum,indexMinimum,indexMaximum)
#print(get_min_and_max([]))
#print(get_min_and_max([1]))
#print(get_min_and_max([ 1,2 ,5, -1,-1,5]))


Ich habe noch eine Frage, du hast diese main Methode geschrieben insbesondere:
if __name__ == "__main__":
main()

Ich versuche seit Tagen das zu begreifen ,habe in einige Bücher zuhause gelesen und in Internet ,leider kommt es nicht so wirklich in meinem Bewusst rein. Ich habe absolute Blokade , leider.
Ich versuche heute nochmal in deinem Code zu verstehen vielleicht mit eine Zeichnung . Falls du noch Zeit und Lust hast mir zu schreiben in eine einfaches deutsch wurde ich mich sehr freuen und im vorraus von mir DANKESCHÖN.
Liebe Grüsse Claudia
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@claudia: Das ist ineffizient da immer wieder `index()` aufzurufen. Den laufenden Index kann man sich mit der `enumerate()`-Funktion generieren lassen. Dann ist das nur eine einfache Zuweisung statt einer linearen Suche und man hätte im „worst case” keine quadratische Laufzeit.

`None` als Rückgabewert ist unschön. Die eingebauten Funktionen `min()` und `max()` lösen einen `ValueError` aus:

Code: Alles auswählen

In [339]: min([])                                                               
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-339-cb4199d4da81> in <module>
----> 1 min([])

ValueError: min() arg is an empty sequence
`__name__` wird in jedem Modul an den Namen des Moduls gebunden. Ausser wenn das Modul als Programm ausgeführt wird, dann wird `__name__` an den Wert "__main__" gebunden. Dadurch kann man im Code unterscheiden ob das Modul importiert oder ausgeführt wurde. Und es ist praktisch wenn man Module importieren kann, ohne dass da gleich ein Hauptprogramm abläuft. Zum Beispiel um Funktionen einzeln zu testen, in einer Python-Shell, oder von einem anderen Modul aus, oder mit Unit-Tests.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
claudia
User
Beiträge: 6
Registriert: Sonntag 14. November 2021, 20:45

@_blackjack_: Entschuldige, habe vergessen mich bei dir zu bedanken.DANKESCHÖN .
LG Claudia
Antworten