Frage zur ord()-Funktion

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
S0S
User
Beiträge: 50
Registriert: Samstag 9. Februar 2013, 18:59

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!
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

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)
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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

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()))
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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")
BlackJack

@snafu: Das hat aber nicht so ein schönes Laufzeitverhalten immer jedes Zeichen linear zu suchen.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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)
Zuletzt geändert von snafu am Dienstag 23. April 2013, 00:00, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

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 ;-)
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@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).
S0S
User
Beiträge: 50
Registriert: Samstag 9. Februar 2013, 18:59

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:
Antworten