Quersumme

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Code: Alles auswählen

In [1]: num = "312313"

In [2]: sum(map(int, num))
Out[2]: 13
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@BlackVivi: das sieht noch mal besser aus. Danke :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

abgdf hat geschrieben:Na dann, gute Nacht :wink: ...
Schön wärs ;-) Muss noch was schaffen ...
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

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

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Statt `map` kann man ja `imap` verwenden; vorzugsweise, wenn man sowieso schon was aus `itertools` importiert.
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 ;)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

lunar hat geschrieben:rayo's Beispiel enthält keine LC ;)
Meh, Generatorausdruck.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@numerix: Genau solche Magie meinte ich ;-)
Antworten