Was mache ich falsch?

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
Valen7ino
User
Beiträge: 2
Registriert: Freitag 4. Dezember 2020, 20:53

Ich habe gerade angefangen mit Arrays zu arbeiten und möchte ein Programm schreiben, dass ein zufällig generiertes Array (beinhaltet nur Zahlen) nach der Größe sortiert wird. Ich kenne die sort-Befehle, aber ich versuche es gerade auf einen anderen Weg: der 1. Wert des Arrays soll auf min_index gesetzt werden und danach soll überprüft werden ob im Rest des Arrays noch kleinere Zahlen sich befinden. Wenn es eine kleinere Zahl gibt soll diese auf den Wert min_index gesetzt werden und dann mit dem Wert der ersten Stelle getauscht werden. Am Ende sollte dann ein sortiertes Array herauskommen, aber ich habe Schwierigkeiten mit meinem Code:

import random
A = []
for i in range(15):
A.append(random.randrange(100))
print(A)

a = 0
for a in range(0,len(A)):
min = A[a]
if A[a] <= A[a+1]:
pass
elif A[a] > A[a+1]:
A[a], A[a+1] = A[a+1], A[a]

print(A)
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Valen7ino: Als erstes mal solltest Du Listen nicht als Arrays bezeichnen. Es gibt in Python auch Arrays und damit ist in der Regel der Datentyp aus dem externen Numpy-Package gemeint.

Dann sind gute Namen wichtig. `A` und `a` sind keine guten Namen, denn die verraten dem Leser nicht worum es sich bei den Werten dahinter handelt. `A` könnte beispielsweise `numbers` heissen und `a` ist ein `index`. Wobei das eine der Ausnahmen ist, wo einbuchstabige Namen gängig sind, nämlich `i`, `j`, und `k`.

Wenn man einen Namen aus syntaktischen Gründen braucht, ihn dann aber gar nicht verwendet, wie in der Schleife in der die zufälligen Zahlen erzeugt werden, ist der Name `_` üblich, damit der Leser weiss, dass es Absicht ist, dass der Namen nicht verwendet wird.

Es bietet sich eine „list comprehension“ an, um die Liste zu erzeugen.

Die Zuweisung von 0 an `i` vor der Schleife ist sinnlos. Diese 0 wird nirgends verwendet.

0 ist der Defaultwert für den Startwert bei `range()`, den braucht man nicht angeben.

`min` ist der Name einer eingebauten Funktion, den sollte man nicht an etwas anderes binden. Der Name wird dann ja auch gar nicht weiter verwendet.

Wenn im ``elif`` genau die Gegenteilige Bedingung wie im ``if`` steht, dann ist das einfach nur ein ``else`` ohne das man da noch mal irgend etwas prüfen müsste.

Wenn im ``if``-Zweig nur ein ``pass`` steht, dann will man da die Bedingung umdrehen und den Code aus dem ``else`` dort statt dem ``pass`` haben und den ``else``-Zweig weglassen.

Code: Alles auswählen

#!/usr/bin/env python3
import random


def main():
    numbers = [random.randrange(100) for _ in range(15)]
    print(numbers)

    for i in range(len(numbers)):
        if numbers[i] > numbers[i + 1]:
            numbers[i], numbers[i + 1] = numbers[i + 1], numbers[i]

    print(numbers)


if __name__ == "__main__":
    main()
Und bei dem Code bekommst Du auch immer noch den gleichen offensichtlichen Fehler, den Du nicht verraten hast.

Der Code macht auch nicht was Du im Beitrag beschreibst. Du musst das umsetzen was Du dort beschreibst. Schritt für Schritt. Denn der Code sieht eher wie ein Teil von einem Bubblesort aus, Du willst aber ein Sortieren durch Auswahl („selection sort“)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Valen7ino
User
Beiträge: 2
Registriert: Freitag 4. Dezember 2020, 20:53

@__blackjack__ Danke für deine hilfreiche Antwort. Ich habe versucht dein Feedback in mein Code zu integrieren, aber trotzdem funktioniert es nicht wie ich möchte. Zuerst soll die erste Zahl als Minimum definiert werden und mit jeder weiteren Zahl nach ihrer Größe vergleicht werden. Sobald es eine Zahl gibt, die kleiner ist, soll diese an den Anfang gesetzt und dann als Minimum definiert werden. Dann soll eben der zweite Wert genommen werden und mit den weiteren verbleibenden Zahlen verglichen werden.

Code: Alles auswählen

import random
A = []
for i in range(5):
    A.append(random.randrange(50))      
print(A)


k = 0
min = A[k]
for k in range(0,len(A)):
    if k+1 >= min:
        pass
    elif k+1 < min:
        A[0], A[k] = A[k], A[0]
        min = A[k]
print(A)


Könntest du mir bitte noch einmal helfen und meinen Code verbessern. Es wird eine Liste ausgegeben, aber sie ist überhaupt nicht sortiert.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum vergleichst Du einen Wert der Liste `min` mit einem Index k+1? Wenn man Äpfel mit Birnen vergleicht ist das meist ein Fehler.
Wenn du A[0] mit A[k] tauschst, welchen Wert hat dann A[k]?
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du vergleichst den Index k mit dem Wert min. Das ist falsch. Du fuehrst ausserdem keinen Index fuer die Position mit, an der das kleinste Element landen soll, weil du k nicht nur dafuer nutzt, sondern auch als Laufvariable. Und codierst stattdessen hart 0 - womit du immer nur genau einmal die kleinste Zahl bestimmst.

Es muessen zu guter Letzt *zwei* for-schleifen sein: eine auessere zum verschieben der minimums-Position. Und eine innere, um alle Zahlen an einer Postion groesser bis zum Ende der Liste mit der Minimums-Position zu vergleichen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Wenn du den Rat von __blackjack__ befolgt und vernünftige Namen vewendet hättest, wäre dir das selbst aufgefallen.
In specifications, Murphy's Law supersedes Ohm's.
Antworten