Seite 1 von 1

Frage zur Bearbeitung einer Liste

Verfasst: Sonntag 24. Mai 2009, 18:06
von Bbob
Hallo Zusammen,
ich muss leider für die Uni ein ein Programme schreiben bei dem ich nicht weiter komme! z.B. für folgende Liste:
liste = [9.11, 9.32, 10.09, 10.22, 11.19, 9.99, 9.43, 10.56, 12.23, 8.45]

soll eine neue Liste ausgeben werden, bei der alle Zahlen unter 10 gleich bleiben. ABER alle Zahlen über 10 sollen ersetzt werden. Und zwar durch die Summe der vorherigen Zahl (die kleiner 10 ist) und der nachfolgenden Zahl (die kleiner 10 ist), dividiert durch 2.
Also im obrigen Beispiel sollen z.B. die Zahlen ...10.09, 10.22, 11.19... ersetzt werden durch (9.32 + 9.99)/2 = 9.655

hoffentlich kein mir jemand weiter helfen! BITTE!

Re: Frage zur Bearbeitung einer Liste

Verfasst: Sonntag 24. Mai 2009, 18:12
von numerix
Bbob hat geschrieben:hoffentlich kein mir jemand weiter helfen! BITTE!
Hallo Bbob, willkommen im Forum.
Wieso "leider" - ein Python-Programm schreiben zu dürfen, ist doch prima. Sei froh, dass du es nicht in Java schreiben musst. :)

Und: Großbuchstaben helfen nicht.

Zum Problem:
Du müsstest die Liste durchlaufen und jedes Element prüfen, ob es kleiner 10 ist oder nicht. Wenn nicht, merkst du dir den Index und läufst weiter in der Liste, bis die erste Zahl kommt, die wieder kleiner als 10 ist. Dann kannst du über den 1. gemerkten Index und den aktuellen auf die beiden umrahmenden Elemente kleiner 10 deren Mittelwert berechnen und mittels Slicing den Teil der Liste dazwischen damit befüllen.

Verfasst: Sonntag 24. Mai 2009, 18:13
von nemomuk
Wo liegt da jetzt genau das Problem? Sollen wir diese Aufgabe für dich übernehmen?

Verfasst: Sonntag 24. Mai 2009, 18:57
von BlackJack
Eine Lösung mit `numpy`. :-)

Code: Alles auswählen

import numpy

def main():
    numbers = numpy.array([9.11, 9.32, 10.09, 10.22, 11.19,
                           9.99, 9.43, 10.56, 12.23, 8.45])
    print numbers
    borders = numpy.arange(len(numbers))[numpy.diff(numbers > 10)]
    borders.shape = (len(borders) // 2, 2)
    for i, j in borders:
        numbers[i + 1:j + 1] = (numbers[i] + numbers[j + 1]) / 2
    print numbers

Verfasst: Montag 25. Mai 2009, 10:49
von yantur_v_b
Naja, müsste auch ohne numpy gehen, denke ich...

Schätzungsweise nimmt man am besten eine for-Schleife (weißt Du, Bbob, wie das geht?) und prüft für jedes Element,
- ob es kleiner als 10 ist,
- und wenn es größer ist, welches die beiden angrenzenden kleineren sind.
Die addiert und halbiert man dann und trägt sie ein.

Hilfreich könne es sein, die index()-Funktion von Listen zu verwenden.
Wenn die die for-Schleife über die Länge der Liste einrichtest (also über range(len(liste)) ), hast Du immer gleich eine dem Index-Wert entsprechende Zahl. Python zählt allerdings von 0 an, d.h. in der gegebenen Liste hätte 9.11 den Index 0, 9.32 den Index 1 usw.
10.3 als erste Zahl größer als 10 käme auf dem Index-Wert 2, d.h. wenn Du liste.index(10.3) abfragst, bekommst Du 2 als Ergebnis. Von diesem Index-Wert aus kannst Du dann, indem Du mit einer neuen for-Schleife, die den Index verringert, den nächstliegenden Wert unter 10 suchen (das sollte in diesem Falle schnell gehen) und mit einer weiteren for-Schleife den nächsthöheren. Dann hast Du zwei Variablen, die Du addieren und das Ergebnis teilen kannst.

Nach den drei for-Schleifen hast Du nun für jede Position wieder eine Zahl. Wenn Du schon ganz zu Anfang eine neue leere Liste anlegst, kannst Du die jeweils dort anhängen, beispielsweise mit .append().

Kannst Du damit was anfangen? ;-)

Verfasst: Montag 25. Mai 2009, 10:53
von EyDu
Das müsste nicht nur ohne numpy gehen, es geht auch ohne. BlackJack wollte nur nicht die Lösung verraten ;-)

range(len(liste)) ist übrigens ein schlechte Umsetzung. Wenn man unbedingt die Indizes brauchst, dann mit enumerate(liste).

Verfasst: Montag 25. Mai 2009, 10:57
von Dill
was ist das denn für eine schwachsinnige aufgabe?
an einer uni? :?

Verfasst: Montag 25. Mai 2009, 11:52
von lunar
Wieso nicht? Erstsemesterprogrammierkurs halt ... es ist ja nicht so, dass jeder Informatikstudent schon mal programmiert hätte.

Verfasst: Montag 25. Mai 2009, 12:38
von yantur_v_b
Eine schlechte Umsetzung ist immer noch besser als gar keine. Wenn also die besseren nicht "verraten werden" sollen, bleibt halt nur die schlechtere Hilfe...

Verfasst: Montag 25. Mai 2009, 12:43
von EyDu
Ich habe die bessere Lösung doch verraten: enumerate(liste).

Verfasst: Montag 25. Mai 2009, 13:40
von BlackJack
@Dill: Da werden aufeinanderfolgende Messwerte, Samples, Pixeldaten, oder etwas Ähnliches, die einen bestimmten Wert überschreiten durch den Mittelwert der "Ränder" von dem Bereich ersetzt. Da gibt es sicher sinnvolle Anwendungen für.

Und man muss auch ein bisschen Nachdenken über die Implementierung. Also dass die Leute zum Beispiel nicht die Index-Methode verwenden, was ist laufzeittechnisch totaler Blödsinn ist, die Liste nach einem Wert zu durchsuchen, den man schon einmal in der "Hand" hatte und sich genau so gut an der Stelle den Index einfach hätte merken können.

@Bbob: Ich schliesse mich da den Vorrednern an, die ``enumerate(liste)`` vorgeschlagen haben. Das sollte die äussere Schleife sein, mit der man auch nur einmal von vorne bis hinten durch die Liste gehen muss, wenn man sich unterwegs die richtigen Sachen merkt.

Interessant sind bei solchen Aufgaben auch immer die "Randfälle". Das ist in diesem Fall sogar wörtlich zu nehmen. Wie soll das Ergebnis bei [11,9,7,8,12] aussehen?