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... :P 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: 8)

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.