Re: neue Liste
Verfasst: Dienstag 10. Februar 2015, 13:59
@garreth: ``lambda`` ist überflüssig wenn es bloss eine Funktion mit den selben Argumenten aufruft die es selbst bekommen hat.
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
>>> alle
[20, 33, 21, 32, 27, 7, 25, 16, 32, 27, 21, 22, 44, 55, 12, -1, 2]
>>> original(alle)
[7, 11, 7, 11, 9, 3, 9, 6, 11, 9, 7, 8, 12, 12, 4, 1]
>>> gareth1(alle)
[6.0, 11.0, 7.0, 10.0, 9.0, 2.0, 8.0, 5.0, 10.0, 9.0, 7.0, 7.0, 14.0, 18.0, 4.0, -1.0, 0.0]
>>> gareth2(alle)
[7.0, 11.0, 7.0, 11.0, 9.0, 3.0, 9.0, 6.0, 11.0, 9.0, 7.0, 8.0, 15.0, 19.0, 4.0, 0.0, 1.0]
Manchmal vergesse ich zu erwähnen, dass ich ausschließlich Python 3 programmiere. Der Fehler tritt nur in Python 2 auf und muss natürlich in diesem Fall angepasst werden.sparrow hat geschrieben:Hi Garreth,
deine beiden Lösungen verhalten sich anders als das was der Threadstarter gepostet hat.
Code: Alles auswählen
# python3 -i test.py
>>> alle
[20, 33, 21, 32, 27, 7, 25, 16, 32, 27, 21, 22, 44, 55, 12, -1, 2]
>>> original(alle)
[7, 11, 7, 11, 9, 3, 9, 6, 11, 9, 7, 8, 12, 12, 4, 1]
>>> gareth1(alle)
[7, 11, 7, 11, 9, 3, 9, 6, 11, 9, 7, 8, 15, 19, 4, 0, 1]
>>> gareth2(alle)
[7, 11, 7, 11, 9, 3, 9, 6, 11, 9, 7, 8, 15, 19, 4, 0, 1]
Code: Alles auswählen
[(min(n, 33) + 3) // 3 for n in numbers if n > 0]
So nun speziell für sparrow unter Berücksichtigung der Sonderfälle, lauffähig unter Python 2 und mit anschaulicher Darstellung einer if-elif-else Abfrage:sparrow hat geschrieben:Die Sonderfälle werden auch unter Python3 nicht berücksichtigt:
Code: Alles auswählen
def transform_number(i):
if i < 1:
return False
elif i > 33:
return 12
else:
result = i / 3.0
if result == i / 3.0+0.5 and i % 3 != 0:
result += 1
return int(round(result))
if __name__ == '__main__':
alle = [20, 33, 21, 32, 27, 7, 25, 16, 32, 27, 21, 22, 44, 55, 12, -1, 2]
print(alle)
alle = list(filter(None,map(transform_number,alle)))
print(alle)
haeuslermartin hat geschrieben:Die Zahll der ursprünglichen Listeneinträge bleibt bei 12, im Endeffekt soll immer nur ein neuer Eintrag hinzukommen, dafür fällt der letzte aber raus.
Code: Alles auswählen
from collections import deque
numbers = ((min(n, 33) + 2) // 3 for n in all_numbers if n > 0)
result = deque(numbers, 12)
print(list(result))
Code: Alles auswählen
if result = i / 3.0+0.5 and i % 3 != 0:
Nein und ja, ich habe ihn schon mal laufen lassen, allerdings noch mal hier abgetippt. Der Fehler hat sich dann eingeschlichen.Hyperion hat geschrieben:@garreth: Den Code hast Du doch nie laufen lassen‽ Da ist ein Syntaxfehler in Zeile 8...
Abgesehen davon empfinde ich diese Berechnung als unelegant. Und wie man das anschaulicher und vermutlich auch effizienter berechnet ist ja nun schon gezeigt worden. Und eine Mischung aus Integer- und booleschen Rückgabewerten empfinde ich auch als wenig gelungen. Da sollte man die Filterung vor verlagern, wie es bei den Lösungen mit List Comprehensions auch gemacht worden ist.
Code: Alles auswählen
def transform_number(i):
if i < 1:
return 0
elif i > 33:
return 12
else:
if i % 3 == 0:
return int(i/3)
else:
return int(i/3+1)
if __name__ == '__main__':
alle = [20, 33, 21, 32, 27, 7, 25, 16, 32, 27, 21, 22, 44, 55, 12, -1, 2]
print(alle)
alle = list(filter(None,map(transform_number, alle)))
print(alle)
Code: Alles auswählen
if __name__ == '__main__':
erwartet = [7, 11, 7, 11, 9, 3, 9, 6, 11, 9, 7, 8, 12, 12, 4, 1]
alle = [20, 33, 21, 32, 27, 7, 25, 16, 32, 27, 21, 22, 44, 55, 12, -1, 2]
print(alle)
ergebnis = list(filter(None,map(transform_number, alle)))
print(ergebnis)
assert(erwartet == ergebnis )
Diesen Fehler kann ich grad nicht reproduzieren. Ich hab das mal mit den beanstandeten Zahlen versucht Ausgabe ist sowohl in Python 2 als auch Python3 wie vorgesehen.snafu hat geschrieben:Dein neuer Code ist leider wieder falsch. Im Original soll bei einer 3 eine 1 ausgeliefert werden. Bei dir würde bei einer 3 (oder einer 6 oder einer 9 ...) eine 0 (bzw 1 bzw 2 ...) rauskommen. Erkennst du den Fehler?
Du musst im Grunde gar nicht unterscheiden, ob bei einer Division durch 3 ein Rest rauskommt, sondern du musst die Zahl nur so "vorbereiten", dass die ganzzahlige Division das gewünschte Ergebnis liefert. Das kann man ja im Kopf mal anhand einiger Beispiele durchrechnen.
Code: Alles auswählen
def transform_number(i):
if i < 1:
return 0
elif i > 33:
return 12
else:
return int((i-0.1)/3+1)
if __name__ == '__main__':
alle = [20, 33, 21, 32, 27, 7, 25, 16, 32, 27, 21, 22, 44, 55, 12, -1, 2]
erwartet = [7, 11, 7, 11, 9, 3, 9, 6, 11, 9, 7, 8, 12, 12, 4, 1]
print(alle)
alle = list(filter(None,map(transform_number, alle)))
print(alle)
print(alle == erwartet)
Danke mir vor allem für den Hinweis auf Unit Testing! Befasse Dich damit ruhig, auch wenn das außerhalb des eigentlichen Problems hier stehtgarreth hat geschrieben: Danke an Hyperion für den Tip mit dem erwartet Vergleich, macht die Angelegenheit wesentlich einfacher!
Auf jeden Fall, danke dir. Hatte das gestern rausgemacht, weil ich keine Ausgabe hatte. Heute konnte ich mich dann kurz einlesen und ja, wertvoller Tip!Hyperion hat geschrieben:Danke mir vor allem für den Hinweis auf Unit Testing! Befasse Dich damit ruhig, auch wenn das außerhalb des eigentlichen Problems hier steht