Seite 1 von 1
Quersumme
Verfasst: Dienstag 2. Dezember 2008, 22:37
von Hyperion
Hallo,
wie kann man möglichst elegant die Quersumme einer Zahl ausrechnen? Die "Zahlen" liegen als String vor, da es sich immer um Matrikel-Nummern handelt, die per http an ein Server-seitig laufendes Script übermittelt werden (sollen).
Innerhalb des Scriptes benötige ich die Quersumme und habe da ein wenig rumüberlegt, bin aber im Moment zu müde zum Knobeln. Hier meine Lösung:
Code: Alles auswählen
def quer(matrikel):
q = 0
for m in matrikel:
q += int(m)
return q
Ich wette, dass das irgend wie mit den itertools oder anderer "Magie" sicherlich als lambda Funktion o.ä. gehen sollte. Da hier viele Knobler im Board unterwegs sind, dachte ich es wäre für einige vielleicht ein Spaß, das zu optimieren
PS: Ich hoffe hier kommt jetzt niemand auf die Idee, ich wollte Hausaufgaben lösen wollen! - ganz im Gegenteil ist das ein Hilfsmittel, eine nette Hausübung zu gestalten
Verfasst: Dienstag 2. Dezember 2008, 22:39
von BlackVivi
Code: Alles auswählen
In [1]: num = "312313"
In [2]: sum(map(int, num))
Out[2]: 13
Verfasst: Dienstag 2. Dezember 2008, 22:40
von Hyperion
Ok, manchmal ist man mit Blindheit geschlagen!
Narf ... omg, ich sollte ins Bett gehen
Verfasst: Dienstag 2. Dezember 2008, 22:40
von Hyperion
@BlackVivi: das sieht noch mal besser aus. Danke
Verfasst: Dienstag 2. Dezember 2008, 23:14
von abgdf
Na dann, gute Nacht
...
Verfasst: Dienstag 2. Dezember 2008, 23:31
von Hyperion
abgdf hat geschrieben:Na dann, gute Nacht
...
Schön wärs
Muss noch was schaffen ...
Verfasst: Mittwoch 3. Dezember 2008, 09:00
von rayo
Hi
Ich würde diese Lösung verwenden:
Aus folgenden Gründen:
1. Erzeugt nicht zuerst eine Liste wie Map oder die List Comprehension
2. Ist es Lesbarer als ein sum(map())
Gruss
Verfasst: Mittwoch 3. Dezember 2008, 14:11
von BlackVivi
rayo hat geschrieben:1. Erzeugt nicht zuerst eine Liste wie Map oder die List Comprehension
Imho ist map aber trotzdem schneller als'ne LC... wobei der Unterschied wirklich nich ... dolle wichtig ist.
(
http://paste.pocoo.org/show/93677/ hab ich mal in 5 Minuten geschrieben... vielleicht kein Vorzeigetest, aber hab auch schon bei vielen anderen Quellen gelesen, dass map, itertools, reduce und sowas etwas schneller sind als eine LC)
rayo hat geschrieben:2. Ist es Lesbarer als ein sum(map())
Ist das nicht eher Ansichtssache?... Hey, ich liebe auch LCs... aber nur um eine Funktion anzuwenden... dafür würde ich es nich mehr verwenden.
Re: Quersumme
Verfasst: Mittwoch 3. Dezember 2008, 15:01
von numerix
Hyperion hat geschrieben:Ich wette, dass das irgend wie mit den itertools oder anderer "Magie" sicherlich als lambda Funktion o.ä. gehen sollte.
Sicher:
Code: Alles auswählen
In [46]: quer = lambda n:reduce(lambda a,b:int(a)+int(b),n)
In [47]: quer('121344')
Out[47]: 15
Oder auch die innermathematische Variante
:
Code: Alles auswählen
In [48]: quer = lambda zahl:sum([(zahl//10**k)%10 for k in xrange(int(math.log10(zahl))+1)])
In [49]: quer(int('121344'))
Out[49]: 15
Verfasst: Donnerstag 4. Dezember 2008, 14:59
von Y0Gi
Statt `map` kann man ja `imap` verwenden; vorzugsweise, wenn man sowieso schon was aus `itertools` importiert.
Verfasst: Donnerstag 4. Dezember 2008, 18:29
von lunar
rayo hat geschrieben:Aus folgenden Gründen:
1. Erzeugt nicht zuerst eine Liste wie Map oder die List Comprehension
Da (i)map aber eine C-Funktion ist, während ein Listenausdruck bzw. ein Generatorausdruck sich technisch kaum von einer For-Schleife unterscheidet, ist (i)map meist schneller.
2. Ist es Lesbarer als ein sum(map())
Das kommt darauf an, wie man zu programmieren gewohnt ist. Für Leute mit funktionalen Hintergrund ist "map()" trivial ...
@BlackVivi
rayo's Beispiel enthält keine LC
Verfasst: Donnerstag 4. Dezember 2008, 19:41
von BlackVivi
lunar hat geschrieben:rayo's Beispiel enthält keine LC
Meh, Generatorausdruck.
Verfasst: Donnerstag 4. Dezember 2008, 20:34
von Hyperion
@numerix: Genau solche Magie meinte ich