Listen richtig sortieren

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
patti_pg
User
Beiträge: 3
Registriert: Sonntag 15. Februar 2009, 17:25

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.'''
 
Benutzeravatar
Craven
User
Beiträge: 223
Registriert: Dienstag 24. Januar 2006, 13:37

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?
[code]q = 'q = %s; print q %% repr(q)'; print q % repr(q) [/code]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Multilineprints gehen übrigens so:

Code: Alles auswählen

print '''Erste Zeile
Zweite Zeile
Dritte Zeile"""
Und PEP 8 sollte man lernen.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

@bremer: Multilines gehen so nicht - Tipp: Schau mal welche Anführungsstriche Du da mixt. ;-)
patti_pg
User
Beiträge: 3
Registriert: Sonntag 15. Februar 2009, 17:25

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
Antworten