Seite 1 von 1

Listen richtig sortieren

Verfasst: Mittwoch 18. Februar 2009, 18:19
von patti_pg
Hallo!
Ich habe hier ein kleines Programm das eine Menge 'eingabe' an Zufallszahlen zwischen 0 und 20 erzeugt, in Erzeugungsreihenfolge ausgibt, danach sortiert und dann sortiert wieder ausgibt.
Ich habe zwei Probleme. Ich möchte die Ausgabe so formatieren, dass mehrere Ergebnisse, z.B. fünf Zufallszahlen in einer Reihe sind. Momentan kriege ich eine hin.
Zum Zweiten sortiert .sort() ja auch ganz gut. Nur eben zu gut. Die Ausgabe ist ungefähr:
0.5
0.8
1.03
11
12
14
17
19
2.4
5
7.5
9.9
Ihr versteht sicherlich, was ich meine. Ich hätte es aber gerne, das es von 0-20 herauf sortiert ausgegeben wird. ich habe schon sowas ausprobiert wie L.sort(0, 20) aber das funktioniert nicht.
Hier der Code

Code: Alles auswählen

import random
import pprint

L = []  # Erstellt eine Liste für die Zufallswerte
eingabe = raw_input('Geben Sie die Anzahl der Durchläufe an!')
if int(eingabe) < 10000:
    i =  1
    while i < int(eingabe):     # Beginnt eine Schleife, die die Anzahl der Zufallszahlen bestimmt.
        f = random.random()     # Generiert Zufallszahl.
            f = f * 20          # Multipliziert mit 20 um Zahlen zwischen 0 und 20 zu erhalten.
        L.append(str(f))        # Zufallszahl wird an die Liste angehängt.
        i = i+1                 # Erhöht i um 1, damit die Schleife nicht endlos wird.

    print ''
    print 'Die unsortierten Zahlen:'
    print ''
    pprint.pprint(L)            # Gibt die Zufallszahlen formatiert aus.
    
    L.sort()                    # Sortiert die Zufallszahlen in der Liste.
    print ''
    print 'Hier die sortierten Zahlen:'
    print ''
    pprint.pprint(L)
elif int(eingabe) > 10000 and int(eingabe) < 2000001:   # Überprüft, ob die Berechnung nicht zu lange dauern würden
    print 'Sie haben mehr als 10000 Durchläufe angegeben.'
    print 'Die Berechnungen könnten länger als eine Minute'
    print 'dauern. Sind Sie sicher, das Sie das Programm'
    print 'starten möchten?'
    wahl = raw_input('j/n')         # Fragt vorsichtshalber nach, da die Berechnung lange dauern könnte
    if wahl == 'j':         #Wenn Ja gewählt wird, beginne das eigentliche Programm
        i =  1
        while i < int(eingabe):
            f = random.random()
            f = f * 20
            L.append(str(f))
            i = i+1
        print ''
        print 'Die unsortierten Zahlen:'
        print ''
        pprint.pprint(L)
    
        L.sort()
        print ''
        print 'Hier die sortierten Zahlen:'
        print ''
        pprint.pprint(L)
    elif wahl == 'n':
        print 'Das Programm wird nun beendet.'
else:
    print '''Ihre gewuenschte Anzahl Durchläufe ist zu \n\
 gross fuer normale Rechner. Das Programm\n\
 wird nun beendet.'''
 

Verfasst: Mittwoch 18. Februar 2009, 18:33
von Craven

Code: Alles auswählen

>>> a = []
>>> for x in range(0, 10):
...     a.append(r.random() * 20)
...
>>> a
[5.489957868264332, 4.035478538773023, 14.292803144339656, 2.7087631702611459, 4
.6529663880941863, 10.923668359776453, 9.9674502254849511, 5.7664137876467176, 9
.343297363009377, 18.899852167397931]
>>> a.sort()
>>> a
[2.7087631702611459, 4.035478538773023, 4.6529663880941863, 5.489957868264332, 5
.7664137876467176, 9.343297363009377, 9.9674502254849511, 10.923668359776453, 14
.292803144339656, 18.899852167397931]
Funktioniert wunderbar.

Formatierung geht so:

Code: Alles auswählen

print "%i %i %i %i %i" % (1, 2, 3, 4, 5)
Meintest Du das?

Verfasst: Mittwoch 18. Februar 2009, 18:56
von cofi
Das sortiert "falsch", weil du nach Strings sortierst. Wenn du eine richtige Formatierung willst, solltest du die Floats behalten und erst bei der Ausgabe formatieren.

Verfasst: Mittwoch 18. Februar 2009, 19:01
von BlackJack
@patti_pg: Dein Programm sortiert Zeichenketten und keine Zahlen. Wenn Du Zahlen sortieren lässt werden die auch nach grösse des Werts und nicht alphabetisch sortiert.

Man sollte bemüht sein Quelltextwiederholungen zu vermeiden. Du hast da einen ziemlich langen, identischen Block zweimal im Programm. Du solltest erst die Eingabe überprüfen und dann *einmal* den Quelltext zum Erzeugen der Zahlenliste auführen, oder eben keinmal.

Ebenso ist die ständige Wiederholung von ``int(eingabe)`` unnötig, wenn man diese Umwandlung *einmal* am Anfang macht.

Wenn man vor dem Betreten einer Schleife weiss, wie oft sie wiederholt wird, nimmt man in der Regel ``for`` und nicht ``while``. In diesem Fall ist aber eine "list comprehension" wohl das einfachste.

Verfasst: Mittwoch 18. Februar 2009, 23:37
von sma
Mich wundert ein bisschen die Abfrage > 10.000. Mein Rechner erzeugt und sortiert eine Million Zufallszahlen in unter 3 Sekunden:

Code: Alles auswählen

x = [random.randrange(20) for i in xrange(1000000)]
x.sort()
Für die Ausgabe in 5er-Spalten sollte man wissen, dass ein "print", das mit einem "," endet, keinen Zeilenumbruch erzeugt.

Stefan

Verfasst: Donnerstag 19. Februar 2009, 07:11
von bremer
Multilineprints gehen übrigens so:

Code: Alles auswählen

print '''Erste Zeile
Zweite Zeile
Dritte Zeile"""
Und PEP 8 sollte man lernen.

Verfasst: Donnerstag 19. Februar 2009, 12:02
von CM
@bremer: Multilines gehen so nicht - Tipp: Schau mal welche Anführungsstriche Du da mixt. ;-)

Verfasst: Donnerstag 19. Februar 2009, 16:42
von patti_pg
Danke für eure Antworten!
Bitte nehmt mir meine Fehler nicht übel, ich bin erst seit knapp 2 Wochen dabei, überhaupt zu programmieren. Danke für eure Geduld!
Ach ja, ich benutze die while Schleife, weil ich noch nicht bei der for Schleife angekommen bin ;-)
Patrick