1

我正在尝试编写计算名称数值的程序

这是我写的

name = input("Enter your full name:")
low = name.lower()
sum = 0
print ()
for ch in name :
    print(sum + ord(ch)-96)

问题是当我输入一个名字时,例如我得到的安娜

输出将是

1

14

14

1

我怎样才能只得到总和?在这种情况下将是 30

4

7 回答 7

4

您必须sum每次在循环中更新变量。将循环更改为:

for ch in name :
    sum += ord(ch)-96

print(sum)

您还可以将sum()函数与生成器表达式一起使用:

>>> name='anna'
>>> sum(ord(ch) - 96 for ch in name)
30
于 2013-09-19T06:40:59.910 回答
3

您忘记更改 sum 变量。这样做:

low = name.lower()
sum = 0
print ()
for ch in name :
    sum = sum + ord(ch)-96
print(sum)
于 2013-09-19T06:41:19.760 回答
2

bytearray让我们直接使用添加 ascii 值sum。然后你需要为字符串中的每个字符减去 96

sum(bytearray(low)) - 96 * len(low)

即使对于短字符串,这比在我的计算机上对每个字符使用 ord() 的速度大约是两倍,对于长字符串甚至更好

于 2013-09-19T07:11:41.070 回答
1

首先,避免使用 python 关键字作为变量。sum在您的代码中,您已将实际上是函数的关键字设置为值 0

其次,请注意您处于 for 循环中,因此随着 for 循环的进行,没有任何内容可以存储累加和。

这是我想出的:

name = input("Enter your full name: ").lower() #Convert input to lowercase
print () #Print a newline
print (sum(ord(ch) - 96 for ch in name)) #Use the sum function to compute sum of letters

一条线:

print (sum(ord(ch) - 96 for ch in input("Enter your full name: ").lower()))
于 2013-09-19T07:07:46.020 回答
1

你只需要for ch in name在正确的地方使用 - 使用生成器表达式。它比使用循环更 Pythonic:

name = input("Enter your full name:")
low = name.lower()
print ()

print sum(ord(ch)-96 for ch in name)

您也可以使用列表推导,但它会更慢

print sum([ord(ch)-96 for ch in name])
于 2013-09-19T06:41:25.910 回答
1

您可以将此代码用于 Python 3。

input_name = input("Enter Your Name: ").lower()

print(sum(ord(ch)-96 for ch in input_name))
于 2020-04-04T03:23:50.460 回答
0

事实上,我认为@gnibbler 的解决方案是最好的。

不过,我想分享我的想法。我想使用map而不是for循环或列表理解:

name = input("Enter your full name:")
low = name.lower()
print sum(map(lambda ch: ord(ch)-96, low))
于 2013-09-19T08:17:39.093 回答