所以我有一个非常简单的任务.该项目欧拉问题名成绩给我们带来了一组字符串(这是名称)的文件.现在,您必须按字母顺序对这些名称进行排序,然后为每个名称计算所谓的名称分数,并将它们全部加起来.名称分数计算非常简单.您所要做的就是获取一个名称,然后总结名称中字母的值,然后将此总和与名称在列表中的位置相乘.显然这似乎是一个非常简单的问题.
作为一个python初学者,我想在python上尝试这个并且作为初学者这是我写的代码.我确实使用了列表推导以及总和,但这给了我相同的答案.这是我的代码:
def name_score(s):
# print sum((ord(c)-96) for c in s)
s1 = 0;
for c in s:
s1 = s1 + (ord(c) - 96)
print s1
return s1
# print ord(c) - 96
myList = []
f = open('p022_names.txt')
for line in f:
myList.append(line.lower())
count = 0;
totalSum = 0;
for line in sorted(myList):
count = count + 1;
totalSum += (name_score(line) * count)
print totalSum
Run Code Online (Sandbox Code Playgroud)
现在文件p022_names.txt只包含一行"colin".所以函数name_score("colin")应该返回53.现在尝试任何我总是得到值-33.我在Eclipse上使用PyDev.现在这是一个奇怪的异常现象.如果我只是使用了list变量并在代码中使用值myList = ["colin"]填充它,我会得到正确的答案.老实说,我不知道发生了什么.任何人都可以对这里发生的事情有所了解.程序中也有类似的循环来计算totalSum,但这似乎没有问题.
[编辑]指出问题后,我发布了一个有效的代码的更新版本.
def name_score(s):
return sum((ord(c)-96) for c in s)
with open('p022_names.txt') as f:
myList = f.read().splitlines()
print sum((name_score(line.lower()) * (ind+1)) for ind,line in enumerate(sorted(myList)))
Run Code Online (Sandbox Code Playgroud)
96 - 53 - 33 = 10
Run Code Online (Sandbox Code Playgroud)
那是因为你有一个换行符("\n"在你的文件),因此你line是不是"colin",但"colin\n".
要摆脱换行符,多种方法都可行.这是一个例子:
替换你的行:
for line in f:
Run Code Online (Sandbox Code Playgroud)
有:
for line in f.read().splitlines():
Run Code Online (Sandbox Code Playgroud)