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!

Code: Alles auswählen

sum([int(i) for i in "123456"])
Narf ... omg, ich sollte ins Bett gehen :-D

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 :wink: ...

Verfasst: Dienstag 2. Dezember 2008, 23:31
von Hyperion
abgdf hat geschrieben:Na dann, gute Nacht :wink: ...
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:

Code: Alles auswählen

sum(int(i) for i in num)
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 :lol: :

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