2013-12-19 4 views
1

Я пытаюсь прочитать каждый символ из слов в списке, а затем назначить им значение на основе каждой буквы этого слова. Мой код тупо долго, и я убежден, что должен быть более короткий путь, чтобы сделать это ...Более быстрый способ присвоить числовое значение буквам?

for c in tempWord: 
     if(c == "A"): 
      tempSum += 1 
     elif(c == "B"): 
      tempSum += 2 
     elif(c == "C"): 
      tempSum += 3 
     elif(c == "D"): 
      tempSum += 4 
     elif(c == "E"): 
      tempSum += 5 
     elif(c == "F"): 
      tempSum += 6 
     elif(c == "G"): 
      tempSum += 7 
     elif(c == "H"): 
      tempSum += 8 
     elif(c == "I"): 
      tempSum += 9 
     elif(c == "J"): 
      tempSum += 10 
     elif(c == "K"): 
      tempSum += 11 
     elif(c == "L"): 
      tempSum += 12 
     elif(c == "M"): 
      tempSum += 13 
     elif(c == "N"): 
      tempSum += 14 
     elif(c == "O"): 
      tempSum += 15 
     elif(c == "P"): 
      tempSum += 16 
     elif(c == "Q"): 
      tempSum += 17 
     elif(c == "R"): 
      tempSum += 18 
     elif(c == "S"): 
      tempSum += 19 
     elif(c == "T"): 
      tempSum += 20 
     elif(c == "U"): 
      tempSum += 21 
     elif(c == "V"): 
      tempSum += 22 
     elif(c == "W"): 
      tempSum += 23 
     elif(c == "X"): 
      tempSum += 24 
     elif(c == "Y"): 
      tempSum += 25 
     elif(c == "Z"): 
      tempSum += 26 

Это, наверное, глупый вопрос, но все равно спасибо!

+0

Ответ ниже будет выполнять эту работу. Кроме того, дополнительная информация здесь: http://stackoverflow.com/questions/227459/ascii-value-of-a-character-in-python –

ответ

6

Использование ord для вычисления смещения символа из A.

A = ord('A') 
for c in tempWord: 
    if 'A' <= c <= 'Z': 
     tempSum += ord(c) - A + 1 

A = ord('A') 
tempSum = sum(ord(c) - A + 1 for c in tempWord if 'A' <= c <= 'Z') 
+0

@JoeZ, Вы правы. Спасибо за комментарий. Я починил это. – falsetru

+0

Спасибо за это! :) – Doomlar

1

насчет:

import string 

def assign(word): 
    return sum(string.uppercase.index(ch.upper())+1 for ch in word) 

print assign('SIMPLE') 
1

Ну, лучший совет для этой проблемы заключается в создании словаря, связывающую письмо цифр:

d = {'A':1, 'B':2 ... } 

и меняющийся ваш if else кошмар с этим:

tempSum += d[letter] 

Теперь, посмотрев подробное на вашем примере и организации, это, кажется, что значение суммируется позиция заглавных букв в алфавите, так вещий способ может быть с помощью string модуля как это:

import string 

tempSum += (string.uppercase.index(letter) + 1) 

Надеется, что это помогает

0

Склоняются сделать словарь. Это должно работать лучше, чем использование .index в списке, потому что поиск по запросу ~ O (1), но list.index может принимать O (n) в длине списка (скажем, вы всегда смотрите вверх на «Z», например, - вам нужно отсканировать весь список.) Это не так мало, как с использованием ord, но он более надежный.

В зависимости от того, насколько сложным является отображение, вы можете создать его разными способами. Можно было бы быть:

>>> import string 
>>> d = {c: i for i,c in enumerate(string.ascii_uppercase, 1)} 
>>> d 
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4, 'G': 7, 'F': 6, 'I': 9, 'H': 8, 'K': 11, 'J': 10, 'M': 13, 'L': 12, 'O': 15, 'N': 14, 'Q': 17, 'P': 16, 'S': 19, 'R': 18, 'U': 21, 'T': 20, 'W': 23, 'V': 22, 'Y': 25, 'X': 24, 'Z': 26} 

, после чего:

>>> word = "INCONTROVERTIBLE" 
>>> score = sum(d[c] for c in word) 
>>> score 
201 

или, если вы хотите быть более терпимым недостающих букв, вы можете использовать метод .get со значением по умолчанию 0:

>>> word = "THIS IS A TEST" 
>>> score = sum(d.get(c,0) for c in word) 
>>> score 
149 
Смежные вопросы