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!
Frage zur Bearbeitung einer Liste
Hallo Bbob, willkommen im Forum.Bbob hat geschrieben:hoffentlich kein mir jemand weiter helfen! BITTE!
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.
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
-
- 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?
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?

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).

range(len(liste)) ist übrigens ein schlechte Umsetzung. Wenn man unbedingt die Indizes brauchst, dann mit enumerate(liste).
Das Leben ist wie ein Tennisball.
Wieso nicht? Erstsemesterprogrammierkurs halt ... es ist ja nicht so, dass jeder Informatikstudent schon mal programmiert hätte.
-
- 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...
@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?
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?