Ich glaube, es wäre ganz hilfreich, wenn du deinen letztgültigen Code noch einmal posten könntest - dann kann man konkreter Bezug nehmen.
Zu der Sache mit dem Minimum:
Vor der inneren Schleife hattest du m=0 gesetzt. Wenn du m stattdessen auf das Minimum der Liste setzt, dann klappt es.
Sortieralgorithmus - Problem
@Sandra: ``while``-Schleifen werden solange durchlaufen wie die angegebene Bedingung wahr ist. Jetzt musst Du Dir nur noch überlegen was gelten muss, damit die Schleife noch einmal ausgeführt werden muss. Du veränderst in der Schleife ja einige Werte, was ist also das Anzeichen dafür, dass die Verarbeitung fertig bzw. noch nicht fertig ist!?
Mit `pop()` meinte ich genau das.
Beim Minimum siehe den Beitrag von numerix. Das würde ich das nur *einmal* vor der Schleife ermitteln und an einen weiteren Namen binden. Das Minimum aller Objekte, die sortiert werden sollen, ändert sich während des Sortierens ja nicht.
Mit `pop()` meinte ich genau das.
Beim Minimum siehe den Beitrag von numerix. Das würde ich das nur *einmal* vor der Schleife ermitteln und an einen weiteren Namen binden. Das Minimum aller Objekte, die sortiert werden sollen, ändert sich während des Sortierens ja nicht.
Ja, so sollte man es machen.BlackJack hat geschrieben:Beim Minimum siehe den Beitrag von numerix. Das würde ich das nur *einmal* vor der Schleife ermitteln und an einen weiteren Namen binden. Das Minimum aller Objekte, die sortiert werden sollen, ändert sich während des Sortierens ja nicht.
Hier mein neuer Code:
Das mit dem Minimum und Maximum habe ich allerdings noch nicht verstanden. Reverse ändert doch die Reihenfolge einer Liste, wie soll man sich dies ersparen?
Kann mir eigenentlich jemand die Zeileerklären? Es funktioniert, und Darii hat geschrieben, es kopiert die Liste, doch warum funktioniert es mit li = li nicht?
mfg Sandra
Code: Alles auswählen
#! /usr/bin/env python
import random
a = []
for x in range(10):
a.append(random.random())
a.append(-1)
a.append(-0.5)
print a
def sort1(li):
li = li[:]
a = []
mi = min(li)
ll = len(li)
while(len(a)<ll):
n = 0
m = mi
for y in xrange(len(li)):
if li[y] > m:
n = y
m = li[y]
a.append(li.pop(n))
a.reverse()
return a
b = sort1(a)
print b
Kann mir eigenentlich jemand die Zeile
Code: Alles auswählen
li = li[:]
mfg Sandra
@sandra du solltst mal ein paar tips auch annehmen
das befüllen der liste geht ganz ohne inizialisierung des ARRAY's
a=[]
einfach reinschiesen !
zu listen hier die docu
http://www.python.org/doc/2.4.2/tut/node7.html
das befüllen der liste geht ganz ohne inizialisierung des ARRAY's
a=[]
einfach reinschiesen !
Code: Alles auswählen
a = [random.random() for i in xrange(10)]
http://www.python.org/doc/2.4.2/tut/node7.html
Zuletzt geändert von sea-live am Mittwoch 1. Oktober 2008, 15:27, insgesamt 1-mal geändert.
Eine Zuweisung der Art "li = li" bindet das dahinter liegende Objekt nur an einen neuen Namen, erzeugt aber keine Kopie des Objekts selbst.
Ein Slice über die gesamte Liste "li[:]" dagegen erzeugt ein neues Listen-Objekt mit allen Elementen der Originalliste. Diese wird dann in der Zuweisung an einen Namen gebunden.
Ein Slice über die gesamte Liste "li[:]" dagegen erzeugt ein neues Listen-Objekt mit allen Elementen der Originalliste. Diese wird dann in der Zuweisung an einen Namen gebunden.
Zum Doppelpunkt solltest du einige übungen anstellen mit der shell z.B
: = alles
1:-1 vom element an index 1 bis element 1 weniger listenlenge
:2 alles vor element 2
2: element 2 bis listenende
2:4 element 2 bis vor element 4
Code: Alles auswählen
>>> a=[1,2,3,4,5,6,]
>>> a[1:-1]
[2, 3, 4, 5]
>>> a[:]
[1, 2, 3, 4, 5, 6]
>>> a[:2]
[1, 2]
>>> a[2:]
[3, 4, 5, 6]
>>> a[2:4]
[3, 4]
1:-1 vom element an index 1 bis element 1 weniger listenlenge
:2 alles vor element 2
2: element 2 bis listenende
2:4 element 2 bis vor element 4
Ich bin für jede Antwort dankbar, und versuche Tips an zu nehmen, doch frage halt manchmal nach, da ich es wirklich verstehen möchte, und nicht nur irgend welche Zeilen übernehmen
Ich denke, den Doppelpunkthabe ich jetzt auch verstanden.
Mit etwas Spielerei habe ich nun folgendes gebastelt:
mfg Sandra
Ich denke, den Doppelpunkthabe ich jetzt auch verstanden.
Mit etwas Spielerei habe ich nun folgendes gebastelt:
Code: Alles auswählen
def sort1(li):
li, a = li[:], []
while(li):
m = li[0]
n = 0
for x in xrange(1,len(li)):
if li[x] < m:
m = li[x]
n = x
a.append(li.pop(n))
return a
@sandra
Ich bitte dich nochmals um aufklärung warumm du das ausdrücklich in dieser weise Realisieren möchtest.
es gab nun doch schon genügend einfacherer Lösungswege als deine Listen kopie und erstellung einer neuen sortierten Liste
du übergibst doch eine liste Diese soll unverändert bleiben und als rückgabe erhälst du eine sortierte liste
Dir sollte klar sein das das li in def nicht das li im hauptpfad ist wenn li=li[:] da steht
und somit kansst du mit der liste in def alles machen ohne die original zu zerstören !
Ich bitte dich nochmals um aufklärung warumm du das ausdrücklich in dieser weise Realisieren möchtest.
es gab nun doch schon genügend einfacherer Lösungswege als deine Listen kopie und erstellung einer neuen sortierten Liste
du übergibst doch eine liste Diese soll unverändert bleiben und als rückgabe erhälst du eine sortierte liste
Dir sollte klar sein das das li in def nicht das li im hauptpfad ist wenn li=li[:] da steht
und somit kansst du mit der liste in def alles machen ohne die original zu zerstören !
@sea-live: Sandra hat jetzt eine von ihr selbst geschriebene und komplett verstandene Lösung, warum muss sie sich Dir jetzt unbedingt erklären und eine andere Lösung nehmen?
Dein letzter Satz ist auch ziemlich unangebracht. Genau das hat sie ja verstanden. Das brauchst Du jetzt nicht noch einmal mit Nachdruck erklären.
Dein letzter Satz ist auch ziemlich unangebracht. Genau das hat sie ja verstanden. Das brauchst Du jetzt nicht noch einmal mit Nachdruck erklären.