Seite 1 von 1
Falsche Inhalts wiedergabe
Verfasst: Freitag 13. September 2013, 20:35
von Luca-Python
Hallu Leute,
ich habe folgendes Problem.
Ich habe nach längerer Zeit wieder mit Python herum gespielt und wollte ein Programm schreiben was den Wert deines Names
sagt.
Code: Alles auswählen
a = 10
b = 20
c = 30
d = 40
e = 50
f = 60
g = 70
h = 80
i = 90
j = 100
k = 110
l = 120
m = 130
n = 140
o = 150
p = 160
q = 170
r = 180
s = 190
t = 200
u = 210
v = 220
w = 230
x = 240
y = 250
z = 260
print "Wie viel ist dein Name wert?"
print "Gib deine ersten 3 Buchstaben ein!"
first = raw_input("Dein erster Buchstabe(klein: ")
second = raw_input("Dein zweiter Buchstabe(klein: ")
third = raw_input("Dein dritter Buchstabe(klein: ")
print "Dein Name ist", first + second + third, "Euro wert!"
print "Danke schoen das sie das Programm benutzt haben!"
Doch es wird immer nur die Buchstaben wieder gegeben nicht die Zahlen :I
Ich hoffe auf eine schnelle Rückantwort !!

Danke,
Mit freundlichen Grüßen
Luca-Python

Re: Falsche Inhalts wiedergabe
Verfasst: Freitag 13. September 2013, 20:43
von BlackJack
@Luca-Python: Zeichenketten die der Benutzer eingibt sind nun mal genau das: Zeichenketten. Es wäre sehr ungünstig wenn Python eine Zeichenkette nur solange wie eine Zeichenkette behandelt wie es keinen Namen im aktuellen Namensraum gibt der wie der Inhalt der Zeichenkette heisst. Das gäbe ein ganz schönes Chaos.
Du möchtest die Buchstaben zu den Werten nicht durch Namen zuordnen, sondern mit einem Wörterbuch (`dict`) das Zeichenketten auf Werte abbildet. Oder noch besser: Statt alle 26 Buchstaben und Werte im Programm einzutippen, kann man den Wert auch einfach durch eine Formel aus dem Buchstaben berechnen lassen. Schau Dir mal die `ord()`-Funktion an, und die Gesetzmässigkeit hinter Deiner Zuordnung.
Dann könnte man eine Funktion schreiben, die einen Buchstaben in einen Wert umwandelt. Mit `map()` und `sum()` lässt sich dann sehr einfach der Wert einer Zeichenkette berechnen. Und dann kann man den Benutzer auch den Namen komplett in einer Eingabe vornehmen lassen.
Re: Falsche Inhalts wiedergabe
Verfasst: Freitag 13. September 2013, 20:45
von Luca-Python
Danke schön für die schnelle Antwort

Re: Falsche Inhalts wiedergabe
Verfasst: Freitag 13. September 2013, 21:30
von cofi
Und bevor du jetzt alle Kleinbuchstaben eingibst: Es gibt `string.lowercase`.
Re: Falsche Inhalts wiedergabe
Verfasst: Freitag 13. September 2013, 21:57
von Hyperion
Ergänzend zu cofi: Und ``str.lower()`` - damit kannst Du die Benutzereingabe in Kleinbuchstaben wandeln und musst Dir so nicht merken, dass "a" und "A" auf 10 abgebildet werden

Re: Falsche Inhalts wiedergabe
Verfasst: Freitag 13. September 2013, 22:14
von /me
Und im Endeffekt bleibt dann Folgendes übrig:
Code: Alles auswählen
def get_value_word(word):
return sum(10 * (ord(char) - ord('a') + 1) for char in word.lower())
name = input('Enter your name: ')
print('The value for {} is {}'.format(name, get_value_word(name[:3])))
Re: Falsche Inhalts wiedergabe
Verfasst: Freitag 13. September 2013, 22:30
von BlackJack
Ich hab's etwas ausführlicher und es funktioniert etwas besser falls auch andere Buchstaben oder Zeichen im Namen vorkommen:
Code: Alles auswählen
#!/usr/bin/env python
from itertools import imap
BASE_VALUE = ord('a') - 1
def get_character_value(character):
return (ord(character) - BASE_VALUE) * 10 if 'a' <= character <= 'z' else 0
def get_word_value(string):
return sum(imap(get_character_value, string))
def main():
name = raw_input('Bitte den Namen eingeben: ')
print 'Der Name {0} ist {1} Euro wert.'.format(
name, get_word_value(name[:3].lower())
)
if __name__ == '__main__':
main()
Re: Falsche Inhalts wiedergabe
Verfasst: Freitag 13. September 2013, 23:04
von Hyperion
@BlackJack: ``string`` als Name‽ Und das von Dir...

Wieso nicht ``word`` - wenn die Funktion schon ``get_
word_value`` heißt...
Bei gaaaanz langen Namen ist es effizienter, die Werte nur einmal zu berechnen und bei Bedarf nur nachzuschlagen:
Code: Alles auswählen
CHARACTER_VALUES = dict(zip(string.lowercase, count(10, 10)))
def get_character_value(character):
return CHARACTER_VALUES.get(character, 0)
Re: Falsche Inhalts wiedergabe
Verfasst: Samstag 14. September 2013, 07:37
von /me
BlackJack hat geschrieben:Ich hab's etwas ausführlicher und es funktioniert etwas besser falls auch andere Buchstaben oder Zeichen im Namen vorkommen
Die lange Variante hatte ich auch erst, aber dann habe ich sie eingedampft und dabei Fehlertoleranz auf dem Altar der Kürze des Codes geopfert.
Re: Falsche Inhalts wiedergabe
Verfasst: Samstag 14. September 2013, 15:48
von Sirius3
@/me: Kürze geht so:
Code: Alles auswählen
def get_value_word(word):
return 10 * sum(ord(char)%32 for char in word)
Re: Falsche Inhalts wiedergabe
Verfasst: Samstag 14. September 2013, 17:11
von nezzcarth
Hyperion hat geschrieben:
Bei gaaaanz langen Namen ist es effizienter, die Werte nur einmal zu berechnen und bei Bedarf nur nachzuschlagen:
Code: Alles auswählen
CHARACTER_VALUES = dict(zip(string.lowercase, count(10, 10)))
Falls man auf itertools verzichten will, wäre auch folgendes möglich:
Code: Alles auswählen
CHARACTER_VALUES = {letter: value*10 for value, letter in enumerate(string.ascii_lowercase, 1)}
...oder hätte das irgendwelche Nachteile?
Erschien mir für Einsteiger nachvollziehbarer, aber wer weiß

Re: Falsche Inhalts wiedergabe
Verfasst: Samstag 14. September 2013, 20:34
von EyDu
Die Lösung mittels ``itertools.count`` ist ein wenig kompakter und etwas eingänglicher (wenn man Funktionale Programmierung gewöhnt ist), dein Ansatz kann aber genau so gut eingesetzt werden.