Falsche Inhalts wiedergabe

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
Luca-Python
User
Beiträge: 4
Registriert: Donnerstag 25. Juli 2013, 08:43

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 :)
Zuletzt geändert von Anonymous am Freitag 13. September 2013, 20:45, insgesamt 2-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Ich bin neu, naund?!
Ich kann noch nicht soviel, naund?!
Ich lerne und es macht mir Spaß! :)
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.
Luca-Python
User
Beiträge: 4
Registriert: Donnerstag 25. Juli 2013, 08:43

Danke schön für die schnelle Antwort :)
Ich bin neu, naund?!
Ich kann noch nicht soviel, naund?!
Ich lerne und es macht mir Spaß! :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und bevor du jetzt alle Kleinbuchstaben eingibst: Es gibt `string.lowercase`.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

@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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@/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)
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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ß ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Antworten