关于python:更快捷的方式为字母赋值?

Faster way to assign numerical value to letters?

我试图从列表中的单词中读取每个字符,然后根据该单词中的每个字母为它们赋值。我的代码太长了,我相信一定有一个更短的方法来完成它…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    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

这可能是个愚蠢的问题,但无论如何还是要谢谢你!


使用ord计算字符与A的偏移量。

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


对于这个问题,最好的建议是创建一个将字母和数字关联起来的字典:

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

用这个改变你的if else噩梦:

1
tempSum += d[letter]

现在,通过详细查看您的示例和组织,似乎要求和的值是字母表中大写字母的位置,因此可以使用类似这样的string模块:

1
2
3
import string

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

希望这有帮助


如何:

1
2
3
4
5
6
import string

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

print assign('SIMPLE')

1
2
if 'A'<=c<='Z':
    tempsum+=ord(c)-ord('A')+1

我喜欢编字典。这应该比在列表中使用.index更好,因为dict lookup是~o(1),但是list.index可以在列表的长度中使用o(n)(例如,您总是查找"z",您必须扫描整个列表。)它不像使用ord那么短,但更健壮。

根据映射的复杂程度,您可能希望以多种不同的方式构建它。一个是:

1
2
3
4
>>> 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}

之后:

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

或者,如果您希望更宽容丢失的字母,可以使用默认值为0的.get方法:

1
2
3
4
>>> word ="THIS IS A TEST"
>>> score = sum(d.get(c,0) for c in word)
>>> score
149