所以我有一个非常简单的任务。 Project Euler问题Names Scores为我们提供了一个包含一组字符串(名称)的文件。现在,您必须按字母顺序对这些名称进行排序,然后为每个名称计算所谓的名称分数,并将它们全部加起来。名称分数计算非常简单。您所要做的就是获取一个名称,然后总结名称中字母的值,然后将此总和与名称在列表中的位置相乘。显然这似乎是一个非常简单的问题。
作为一个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
现在文件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)))
答案 0 :(得分:6)
96 - 53 - 33 = 10
这是因为您的文件中有换行符("\n"
),因此line
不是"colin"
而是"colin\n"
。
要摆脱换行符,可以使用多种方法。这是一个例子:
替换你的行:
for line in f:
使用:
for line in f.read().splitlines():
答案 1 :(得分:-3)
可能是因为你没有关闭文件吗?和f.close()
一样?