更快捷地为字母分配数值?

时间:2013-12-19 15:29:10

标签: python

我正在尝试从列表中的单词中读取每个字符,然后根据该单词中的每个字母为它们分配一个值。我的代码是愚蠢的,我相信必须有一个更短的方法来做...

    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

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

6 个答案:

答案 0 :(得分: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')

答案 1 :(得分:1)

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

答案 2 :(得分:1)

怎么样:

import string

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

print assign('SIMPLE')

答案 3 :(得分:1)

嗯,这个问题的最佳建议是创建一个将字母与数字相关联的字典:

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

并用此更改您的if else噩梦:

tempSum += d[letter]

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

import string

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

希望这有帮助

答案 4 :(得分:0)

我倾向于制作字典。这应该比在列表上使用.index表现得更好,因为dict查找是~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

答案 5 :(得分:0)

我知道这是5岁的产品,但是它填补了我所寻找的空白,因此,我将分享我从中获得的功能。

我的目标是将Excel列转换为数字,因此可以将其输入到df.drop()函数中。

这是我构建的函数,最多只能包含2个字符,但是您可以为无限的str长度构建循环。

def get_aspect_ratio(resolution):
    """Determine current aspect ratio"""

    width = resolution[0]
    height = resolution[1]
    gcd = highest_common_factor(round(width,-1),round(height,-1))
    aspect_width = width/gcd
    aspect_height = height/gcd
    return round(aspect_width), round(aspect_height)