2013-12-19 13 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
if 'A'<=c<='Z': 
    tempsum+=ord(c)-ord('A')+1 
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] 

現在,看着你的榜樣和組織細緻,它似乎是要總結的值是大寫字母在字母表中的位置,所以Python的方式,可以使用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