迭代python字符串中的字符并对其值进行求和

时间:2015-04-27 20:04:06

标签: python variables

所以我有一个非常简单的任务。 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)))

2 个答案:

答案 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()一样?