你怎么能从字符串中取出字母并使它们成为整数?

时间:2015-11-15 19:18:18

标签: python python-3.x

我被指派创建一个应用程序,该应用程序使用用户的第一个和第二个名称(确保它们不超过10个字符)并计算他们的幸运姓名号码'基于这个网格:

Lucky Name Number Grid

例如,约翰史密斯将是:

=(1 + 6 + 8 + 5)+(1 + 4 + 9 + 2 + 8)

= 20 + 24

然后将每个值中的数字加在一起:

=(2 + 0)+(2 + 4)

= 2 + 6

= 8< - 他们的幸运姓名。

这是我到目前为止的代码:

while True:
    first_name = input("What is your first name? ")
    if len(first_name) < 10:
        print("Hello " + first_name + ", nice name!")
        break
    else:
        print("First name is too long, please enter a shorter name.")

while True:
     second_name = input("What is your second name? ")
     if len(second_name) < 10:
         print ("Wow, " + first_name + " " + second_name + " is a really cool name. Let's see how lucky you are...")
         break
     else:
          print ("Second name is too long, please enter a shorter name.")

但是,我不确定我的下一步是什么,因为我需要取名字中的每个字母并使其成为特定值。

我能想到这样做的唯一方法是列出每个字母及其指定的值,如下所示:

A = 1
B = 2
C = 3
D = 4
E = 5
F = 6
G = 7
H = 8
I = 9
J = 1
K = 2
L = 3
M = 4
N = 5
O = 6
P = 7
Q = 8
R = 9
S = 1
T = 2
U = 3
V = 4
W = 5
X = 6
Y = 7
Z = 8

fletter_1 = first_name[0]
fletter_2 = first_name[1]
fletter_3 = first_name[2]
fletter_4 = first_name[3]
fletter_5 = first_name[4]
fletter_6 = first_name[5]
fletter_7 = first_name[6]
fletter_8 = first_name[7]
fletter_9 = first_name[8]
fletter_10 = first_name[9]

print fletter_1 + fletter_2 + fletter_3 + fletter_4 + fletter_5 + fletter_6 + fletter_7 + fletter_8 + fletter_9

但这是一个非常漫长的过程,而不是编码的最佳方式。

请有人就如何以最佳方式完成下一步工作给我一些指导,因为我不确定该怎么做。

5 个答案:

答案 0 :(得分:4)

如果您还没有听说过ASCII table,那么它几乎就是如何用二进制表示字符的惯例。根据ASCII表,python中的函数ord(c)为您提供给定字符的值。 我注意到你的Lucky Name Number Grid每9个字母给出相同的值,在数学中可以表示为% 9。因此:

# ASCII value of A
>>> ord('A') 
65
# Except that we wanted 1 for A
>>> ord('A') - 64
1
# And we also want 1 for J and S
>>> (ord('J') - 64) % 9
1
>>> (ord('S') - 64) % 9
1
>>> (ord('Z') - 64) % 9
8

您可以使用以下最后一个公式:(ord(c) - 64) % 9

编辑:正如LoïcG。指出的那样,我的公式有一个小错误,因为模数函数不时返回0,而你的表Grid的索引从1开始。这里是最终版本:

ord(c.lower()) - ord('a')) % 9) + 1

ord('a')返回97(避免对值进行硬编码),c.lower()使函数可以对大小写字符进行操作。与第一个算法的最大区别在于最后+ 1,根据网格的要求将所有索引移动1。

答案 1 :(得分:1)

您应该将网格存储为字典:

luckyNameGrid = {
    'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9,
    'j': 1, 'k': 2, 'l': 3, 'm': 4, 'n': 5, 'o': 6, 'p': 7, 'q': 8, 'r': 9,
    's': 1, 't': 2, 'u': 3, 'v': 4, 'w': 5, 'x': 6, 'y': 7, 'z': 8
}

然后,您可以使用该网格将转换成数字(在将名称转换为小写后),最后,您将这些数字相加以得到结果:

def getLuckyNameNumber (name):
    return sum(map(lambda x: luckyNameGrid[x], name.lower()))

像这样使用:

>>> getLuckyNameNumber('John')
20
>>> getLuckyNameNumber('Smith')
24

要进行最终转换,您基本上想要计算每个幸运名称编号的digit sum。有各种方法可以做到这一点。一种方法是将数字转换为字符串,为每个字符拆分,将字符转换回数字,然后将它们相加:

def getDigitSum (num):
    return sum(map(int, str(num)))

另一个解决方案是将数字连续除以10并将余数相加。这样做的好处是您无需进行类型转换:

def getDigitSum (num):
    sum = 0
    while num > 0:
        num, remainder = divmod(num, 10)
        sum += remainder
    return sum

例如:

>>> getDigitSum(getLuckyNameNumber('John'))
2
>>> getDigitSum(getLuckyNameNumber('Smith'))
6

答案 2 :(得分:0)

从字母到值创建一个字典,叫它说,D。

然后D [&#39; A&#39;] = 1例如

然后这样做

def reduce_value(n):
    return sum(int(i) for i in str(n))

string = "HEYDUDE"
value = sum(D[letter] for letter in string)
while len(str(value)) > 1:
    value = reduce_value(value)
print "final value", value

答案 3 :(得分:0)

您的问题与Convert alphabet letters to number in Python

有关

以下是计算幸运姓名编号的一些代码:

for char in raw_input('Write Text: ').lower():
    print (ord(c.lower()) - ord('a')) % 9 + 1)

或者使用列表理解:

print [(ord(c.lower()) - ord('a')) % 9 + 1 for c in raw_input('Write Text: ')]

然后,要计算得分,您可以在列表中使用sum() buit-in方法:

print sum([(ord(c.lower()) - ord('a')) % 9 + 1 for c in raw_input('Write Text: ')])

答案 4 :(得分:0)

# example char dictionary with corresponding integer values - use the Numerical Value Chart 
# to get the real values for the whole alphabet. You may need to deal with upper/lower
# case characters
charDict = { 'A' : 1, 'B' : 2, 'C' : 3, 'D' : 4} 

# example names - use your own code here
firstName = 'AAB'
lastName = 'DCDD'

# split the strings into a list of chars
firstNameChars = list(firstName)
lastNameChars = list(lastName)

# sum up values
firstNameSum = 0
lastNameSum = 0
for chr in firstNameChars:
    firstNameSum += charDict[chr]
for chr in lastNameChars:
    lastNameSum += charDict[chr]

# cast sums to strings. In your example, this would be '2024'
combinedNames = str(firstNameSum) + str(lastNameSum)

# split the string into a list of chars
combinedNameDigits = list(combinedNames)

# sum them up
finalSum = 0
for dgt in combinedNames:
    finalSum += int(dgt)

# print the lucky number
print finalSum