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

Quersumme

Beitragvon Hyperion » Dienstag 2. Dezember 2008, 22:37

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:

Beitragvon BlackVivi » Dienstag 2. Dezember 2008, 22:39

Code: Alles auswählen

In [1]: num = "312313"

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

Beitragvon Hyperion » Dienstag 2. Dezember 2008, 22:40

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: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 2. Dezember 2008, 22:40

@BlackVivi: das sieht noch mal besser aus. Danke :-)
abgdf

Beitragvon abgdf » Dienstag 2. Dezember 2008, 23:14

Na dann, gute Nacht :wink: ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Dienstag 2. Dezember 2008, 23:31

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:

Beitragvon rayo » Mittwoch 3. Dezember 2008, 09:00

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:

Beitragvon BlackVivi » Mittwoch 3. Dezember 2008, 14:11

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

Re: Quersumme

Beitragvon numerix » Mittwoch 3. Dezember 2008, 15:01

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

Beitragvon Y0Gi » Donnerstag 4. Dezember 2008, 14:59

Statt `map` kann man ja `imap` verwenden; vorzugsweise, wenn man sowieso schon was aus `itertools` importiert.
lunar

Beitragvon lunar » Donnerstag 4. Dezember 2008, 18:29

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:

Beitragvon BlackVivi » Donnerstag 4. Dezember 2008, 19:41

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

Beitragvon Hyperion » Donnerstag 4. Dezember 2008, 20:34

@numerix: Genau solche Magie meinte ich ;-)

Wer ist online?

Mitglieder in diesem Forum: Mephisto