Frage zur Bearbeitung einer Liste

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
Bbob
User
Beiträge: 1
Registriert: Mittwoch 20. Mai 2009, 14:55

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!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Wo liegt da jetzt genau das Problem? Sollen wir diese Aufgabe für dich übernehmen?
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
yantur_v_b
User
Beiträge: 17
Registriert: Montag 25. Mai 2009, 10:32

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? ;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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).
Das Leben ist wie ein Tennisball.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

was ist das denn für eine schwachsinnige aufgabe?
an einer uni? :?
http://www.kinderpornos.info
lunar

Wieso nicht? Erstsemesterprogrammierkurs halt ... es ist ja nicht so, dass jeder Informatikstudent schon mal programmiert hätte.
yantur_v_b
User
Beiträge: 17
Registriert: Montag 25. Mai 2009, 10:32

Eine schlechte Umsetzung ist immer noch besser als gar keine. Wenn also die besseren nicht "verraten werden" sollen, bleibt halt nur die schlechtere Hilfe...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich habe die bessere Lösung doch verraten: enumerate(liste).
Das Leben ist wie ein Tennisball.
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?
Antworten