Seite 1 von 1

Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 22:09
von S0S
Hallo, ich habe folgende Frage:

Ich möchte jedem gegebenen Wort (aus lauter Großbuchstaben) einen sogenannten "alphabetical value" zuordnen, der dadurch berechnet wird, dass man für jeden Buchstaben die Position im Alphabet nimmt (also A=1, B=2, usw.) und die einzelnen Werte addiert. Dafür habe ich folgende Funktion geschrieben:

Code: Alles auswählen

def number_in_alphabet(buchstabe):
    return ord(buchstabe) - 64

def alphabetical_value(string):
    value = 0
    for i in range(len(string)):
        value = value + number_in_alphabet(string[i])
    return value
Nun habe ich eine Liste aus lauter Strings von denen der erste "AARON" lautet. Gebe ich nun aber folgendes ein...

Code: Alles auswählen

print namen[0]
print alphabetical_value(namen[0])
print alphabetical_value("AARON")
...bekomme ich folgendes Ergebnis:
"AARON"
-11
49
Warum unterscheiden sich die Ergebnisse der Funktion alphabetical_value für den String "AARON" und denselben String, wenn man ihn aus der Liste einliest? Durch Probieren habe ich herausgefunden, dass die Differenz immer 60 beträgt, aber ich kann mir nicht vorstellen, woher das kommt. Die einzige Möglichkeit ist meiner Meinung nach, dass das irgendwie mit der ord()-Funktion und der damit zusammenhängenden Unicode-Codierung zu tun hat...

Vielen Dank schon mal im Voraus für eure Antworten!

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 22:19
von snafu
Bei mir klappt es. Auszug aus der Python-Shell:

Code: Alles auswählen

>>> def number_in_alphabet(buchstabe):
...     return ord(buchstabe) - 64
... 
>>> def alphabetical_value(string):
...     value = 0
...     for i in range(len(string)):
...         value = value + number_in_alphabet(string[i])
...     return value
... 
>>> namen = ["AARON"]
>>> print namen[0]
AARON
>>> print alphabetical_value(namen[0])
49
>>> print alphabetical_value("AARON")
49
Zeig doch mal, wie du `namen` anlegst. Wichtig ist, dass du tatsächlich lauffähigen Code postest, bei dem der Fehler auftritt. Also keine nachgebauten Beispiele, die den in Wirklichkeit verwendeten Code bloß imitieren und genau so wenig Beispiele, wo man sich selber etwas dazu schreiben muss, damit sie laufen (so wie ich jetzt mit der Liste).

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 22:22
von EyDu
Außerdem solltest du dir das ``for i in range(len(list))`` abgewöhnen. Bei Python kann man direkt über die Wete iterieren, ohne dass der Umweg über die Indizes gegangen werden muss:

Code: Alles auswählen

for char in string:
Wenn du doch mal einen Index brauchst, dann kannst du die enumerate-Funktion dazu verwenden:

Code: Alles auswählen

for index, char in enumerate(string)

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 22:23
von snafu
Ah, ich hab's:

Code: Alles auswählen

>>> namen = ['"AARON"']
>>> print namen[0]
"AARON"
>>> print alphabetical_value(namen[0])
-11
>>> print alphabetical_value("AARON")
49
Die Anführungsstriche stehen mit in dem Namen drin. Probier mal ein ``ord('"') - 64``, dann weißt du, warum es nicht funktioniert. ;)

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 22:38
von Sirius3
Das Ding ist ein Einzeiler:

Code: Alles auswählen

import re
def alphabetical_value(string):
    return sum(ord(ch)-64 for ch in re.sub('[^A-Z]','',string.upper()))

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 22:53
von snafu

Code: Alles auswählen

import string

def number_in_alphabet(character):
    return string.uppercase.index(character) + 1

def alphabetic_value(s):
    return sum(number_in_alphabet(char) for char in s)

print alphabetic_value("AARON")

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 23:21
von BlackJack
@snafu: Das hat aber nicht so ein schönes Laufzeitverhalten immer jedes Zeichen linear zu suchen.

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 23:41
von snafu
BlackJack hat geschrieben:@snafu: Das hat aber nicht so ein schönes Laufzeitverhalten immer jedes Zeichen linear zu suchen.
Quadratisch, praktisch, gut. 8)

Oder etwa nicht? :o

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 23:53
von snafu

Code: Alles auswählen

from itertools import count, izip
import string

ALPHABET = dict(
    izip(string.uppercase, count(1))
)

def alphabetic_value(s):
    return sum(ALPHABET.get(char, 0) for char in s)

Re: Frage zur ord()-Funktion

Verfasst: Montag 22. April 2013, 23:59
von Sirius3

Code: Alles auswählen

import string
from itertools import count, izip, imap
CH2NUM=dict(izip(string.uppercase,count(1)))
def alphabetic_value(s):
    return sum(imap(CH2NUM.get,s))
EDIT: @snafu: hey, gleicher Gedanke zur gleichen Zeit ;-)

Re: Frage zur ord()-Funktion

Verfasst: Dienstag 23. April 2013, 08:00
von jerch
@OP: Ich bin mir nicht sicher, ob die einfache Summe das ist, was Du wirklich haben willst. Vgl. mal "ABBA" mit "BABA" (Ordnung - kommutativ) oder "TEER" und "TOM" (distributiv).

Re: Frage zur ord()-Funktion

Verfasst: Dienstag 23. April 2013, 18:18
von S0S
snafu hat geschrieben:Ah, ich hab's:

Code: Alles auswählen

>>> namen = ['"AARON"']
>>> print namen[0]
"AARON"
>>> print alphabetical_value(namen[0])
-11
>>> print alphabetical_value("AARON")
49
Die Anführungsstriche stehen mit in dem Namen drin. Probier mal ein ``ord('"') - 64``, dann weißt du, warum es nicht funktioniert. ;)
Ah, danke, genau das war die Antwort, die ich gesucht habe. :lol: