Hallo!
Gibt es in Python eine Methode oder einen einfachen Lösungsansatz für folgendes Problem:
Eingabewert ist eine 8stellige Zahl
Ausgabe soll die Ziffernsumme aller geraden bzw. ungerade Ziffernstellen sein.
z.B.: 12345678
Ergebnis1 = 1+3+5+7 = 16
Ergebnis2 = 2+4+6+8 = 20
Thankx
Ziffernsumme
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Code: Alles auswählen
num = 931233
ungerade = reduce(lambda a, b: a+int(b),str(num)[::-2],0)
gerade = reduce(lambda a, b: a+int(b),str(num)[-2::-2],0)
print "Gerade Ziffern:", gerade
print "Ungerade Ziffern:", ungerade
--- Heiko.
-
- User
- Beiträge: 136
- Registriert: Sonntag 15. Januar 2006, 20:31
- Wohnort: Greifswald
- Kontaktdaten:
Das ist total unfair. Da hat man sich als Anfänger so weit in Python eingeguckt, dass man solche Probleme in irgendwas zwischen einer Halben und zwei Seiten Python lösen könnte, und dann kommt hier im Forum irgendein Guru und zaubert das ganze locker in zwei durchdachten Zeilen hin. Ihr seid gemein... 
Gruß,
Bernhard

Gruß,
Bernhard
-
- Python-Forum Veteran
- Beiträge: 1209
- Registriert: Montag 29. September 2003, 17:18
- Wohnort: Purkersdorf (bei Wien [Austria])
Hi!
Also um ehrlich zu sein versteh ich die Lösung von modeline nicht (sie scheint auch nicht zu funktionieren,oder?). Ich würds so machen:
EDIT: Ich nehm alles zurück ... "Ziffernstellen" ... tja, lesen sollte man können 
EDIT2:
Gruß, mawe
Also um ehrlich zu sein versteh ich die Lösung von modeline nicht (sie scheint auch nicht zu funktionieren,oder?). Ich würds so machen:
Code: Alles auswählen
gerade = sum([int(i) for i in str(num) if not int(i)%2])
ungerade = sum([int(i) for i in str(num) if int(i)%2])

EDIT2:
Code: Alles auswählen
sum([int(i) for i in str(num)[::2]])
sum([int(i) for i in str(num)[1::2]])
Gruß, mawe
Zuletzt geändert von mawe am Mittwoch 5. April 2006, 19:07, insgesamt 1-mal geändert.
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Klar funktioniert sie.
Code: Alles auswählen
modelnine@phoenix ~ $ python
Python 2.4.2 (#1, Apr 3 2006, 12:10:45)
[GCC 3.4.6 (Gentoo 3.4.6, ssp-3.4.5-1.0, pie-8.7.9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> num = 931233
>>> ungerade = reduce(lambda a, b: a+int(b),str(num)[::-2],0)
>>> gerade = reduce(lambda a, b: a+int(b),str(num)[-2::-2],0)
>>> print "Gerade Ziffern:", gerade
Gerade Ziffern: 13
>>> print "Ungerade Ziffern:", ungerade
Ungerade Ziffern: 8
>>>
modelnine@phoenix ~ $
--- Heiko.
Auf die Gefahr hin, daß ich mich vertue, wollte er nicht die Summe von je Gerade oder Ungeraden ?
num = 931233
wäre das nicht einmal:
gerade = 2
ungerade = 9+3+1+3+3
gerade = 2
ungerade = 19 ?
Kann auch sein, daß ich mich nun ganz vertue, und in python bekomm ich es weder elegant noch schnell hin
nur rein logisch habe ich entweder das Problem verkant, oder die Lösung nicht verstanden.
mfg
Alex
num = 931233
wäre das nicht einmal:
gerade = 2
ungerade = 9+3+1+3+3
gerade = 2
ungerade = 19 ?
Kann auch sein, daß ich mich nun ganz vertue, und in python bekomm ich es weder elegant noch schnell hin

mfg
Alex
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Wenn Du Dir das Problem ansiehst, dann will er die Summe der geraden Ziffernstellen und der ungeraden Ziffernstellen.
Sprich:
654321 (sind die Ziffernstellen)
991234
Summe gerader Ziffernstellen = 3+1+9
Summe ungerader Ziffernstellen = 4+2+9
... Und genau das macht der Code den ich produziert hab.
Sprich:
654321 (sind die Ziffernstellen)
991234
Summe gerader Ziffernstellen = 3+1+9
Summe ungerader Ziffernstellen = 4+2+9
... Und genau das macht der Code den ich produziert hab.
--- Heiko.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
modelnine hat geschrieben:Code: Alles auswählen
reduce(lambda a, b: a+int(b),str(num)[::-2],0) reduce(lambda a, b: a+int(b),str(num)[-2::-2],0)
Also ich würde mawe's Lösung vorziehen... Die kann ich persönlich viel besser verstehen... Aber ich mag auch kein lambda und Co.mawe hat geschrieben:Code: Alles auswählen
sum([int(i) for i in str(num)[::2]]) sum([int(i) for i in str(num)[1::2]])

-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Wenn man in mawe's Lösung noch das ::2 und 1::2 durch ::-2 und -2::-2 ersetzt, dann ist sie auch (ganz=komplett=vollständig) in Ordnung, IMHO.
Das Problem stellt sich zwar bei den gegebenen Zahlen nicht (da feste Breite), aber wie nummeriert man? Was ist gerade? Ist die erste Stelle immer eine gerade/ungerade Ziffernstelle? Oder eben die letzte?
Ich persönlich finds wenig sinnvoll von vorne zu zählen, da die Zahlen in diese Richtung wachsen, also zählt man von hinten, und da hab ich per Definition einfach gesagt dass die letzte Ziffer immer eine ungerade ist. Deswegen die -2 und -2::-2, die im Endeffekt nichts anderes bedeuten als dass die Zählrichtung des Splicings umgekehrt ist, und man damit immer einen Fixpunkt hat, egal wie lang (wieviele Stellen) die Zahl hat.
Bei mawe's Lösung ist immer die erste Ziffernstelle eines bestimmten Typs, dadurch hat man seltsame Effekte wenn man eine Dezimal-Stelle hinzutut und sich auf einmal beide Summen ändern, nicht nur eine.
Das Problem stellt sich zwar bei den gegebenen Zahlen nicht (da feste Breite), aber wie nummeriert man? Was ist gerade? Ist die erste Stelle immer eine gerade/ungerade Ziffernstelle? Oder eben die letzte?
Ich persönlich finds wenig sinnvoll von vorne zu zählen, da die Zahlen in diese Richtung wachsen, also zählt man von hinten, und da hab ich per Definition einfach gesagt dass die letzte Ziffer immer eine ungerade ist. Deswegen die -2 und -2::-2, die im Endeffekt nichts anderes bedeuten als dass die Zählrichtung des Splicings umgekehrt ist, und man damit immer einen Fixpunkt hat, egal wie lang (wieviele Stellen) die Zahl hat.
Bei mawe's Lösung ist immer die erste Ziffernstelle eines bestimmten Typs, dadurch hat man seltsame Effekte wenn man eine Dezimal-Stelle hinzutut und sich auf einmal beide Summen ändern, nicht nur eine.
--- Heiko.