我被指派创建一个应用程序,该应用程序使用用户的第一个和第二个名称(确保它们不超过10个字符)并计算他们的幸运姓名号码'基于这个网格:
例如,约翰史密斯将是:
=(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
但这是一个非常漫长的过程,而不是编码的最佳方式。
请有人就如何以最佳方式完成下一步工作给我一些指导,因为我不确定该怎么做。
答案 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