Python 欧拉22号项目,18609年关闭

Python 欧拉22号项目,18609年关闭,python,Python,我正在研究Euler项目的问题22: 使用names.txt(右键单击并“将链接/目标另存为…”),一个包含五千多个名字的46K文本文件,首先将其按字母顺序排序。然后计算出每个名字的字母值,将这个值乘以它在列表中的字母位置,得到一个名字分数 例如,当列表按字母顺序排序时,COLIN是列表中的第938个名称,它值3+15+12+9+14=53。因此,科林的得分为938×53=49714 文件中所有姓名分数的总和是多少 我的代码(如下)获得答案871179673。正确的答案应该是871198282,

我正在研究Euler项目的问题22:

使用
names.txt
(右键单击并“将链接/目标另存为…”),一个包含五千多个名字的46K文本文件,首先将其按字母顺序排序。然后计算出每个名字的字母值,将这个值乘以它在列表中的字母位置,得到一个名字分数

例如,当列表按字母顺序排序时,COLIN是列表中的第938个名称,它值
3+15+12+9+14=53
。因此,科林的得分为938×53=49714

文件中所有姓名分数的总和是多少

我的代码(如下)获得答案
871179673
。正确的答案应该是
871198282
,这让我大约逃过了18公里

def score(name, pos):
    score = 0

    for letter in name:
        if letter == "A": score += 1
        elif letter == "B": score += 2
        elif letter == "C": score += 3
        elif letter == "D": score += 4
        elif letter == "E": score += 5
        elif letter == "F": score += 6
        elif letter == "G": score += 7
        elif letter == "H": score += 8
        elif letter == "I": score += 9
        elif letter == "J": score += 10
        elif letter == "K": score += 11
        elif letter == "L": score += 12
        elif letter == "M": score += 13
        elif letter == "N": score += 14
        elif letter == "O": score += 15
        elif letter == "P": score += 16
        elif letter == "Q": score += 17
        elif letter == "R": score += 18
        elif letter == "S": score += 19
        elif letter == "T": score += 20
        elif letter == "U": score += 21
        elif letter == "V": score += 22
        elif letter == "W": score += 23
        elif letter == "X": score += 24
        elif letter == "Y": score += 25
        elif letter == "Z": score += 26
        else: score += 0
    # end for loop.

    return score * pos
#end def score.

f = open('names.txt')
string = f.readlines()
f.close()

names = sorted(str(string).split(","))
tscore = 0
pos = 1

for name in names:
    tscore += score(name, pos)
    pos += 1
#end for loop.

print tscore
如果我通过score函数运行'Colin'示例,我会得到正确的结果。我测试了列表中的其他几个名字,他们的得分也很正确。我用谷歌搜索了这个问题,得到了各种各样的解决方案,但由于我是python新手,我想知道我做错了什么。谢谢你的时间

更改此行:

names = sorted(str(string).split(","))
致:

文件只包含一行,所以您需要使用
string[0]
访问该行
file.readlines
返回包含文件中所有行的列表,最好执行以下操作:

names = f.read().split(',')
names.sort()
程序的较短版本:

from string import ascii_uppercase
def score(word):
    return sum(ascii_uppercase.index(c) + 1 for c in word.strip('"'))

with open('names.txt') as f:
  names = f.read().split(',')
  names.sort()
print sum(i*score(x) for i, x in enumerate(names, 1))
注意:
string
是一个内置模块,不要将其用作变量名

打印(总和)

我的方式:

splitted = open('names.txt').read().replace('","',',').replace('"','').split(',')
说明: 打开文件,读取它,然后删除双QOUTE,方法是将它们重新设置为none,然后用逗号(,)拆分整个字符串
祝你好运

哇!在这里,如果elif,那就太多了。
ord(char)-64
将执行与那些ifs完全相同的操作。是“文件中的位置”应该从
0
索引还是从
1
索引?还有名字有连字符、空格或撇号吗?哇!成功了,太棒了!为什么会有不同?既然文件是一行,“string”不是只包含一行吗?@Brian是的,但是
string
是一个包含该行的列表,要访问该列表中的该行,您需要执行以下操作:
string[0]
(作为
file.readlines
返回一个列表)具体来说,通过调用
readlines()
返回的
列表上的
str
,布赖恩将
[
]
引入了玛丽和阿隆索的名字中。这将
MARY
推到了列表的末尾,因为
[
排序在
之后。只需
打印姓名
即可查看
'[\'”MARY“
到此结束。没有任何解释的代码转储很少有帮助。堆栈溢出是关于学习,而不是提供片段来盲目复制和粘贴。请回答您的问题并解释它如何比OP提供的更好。
import string
with open("names.txt",'r') as f:
     d=f.read()
d=d.replace('"','')
#print(d)
names=d.split(',')
#print(names)
names.sort()
print(names)
gro=dict()
result=string.ascii_uppercase
count=1
for i in result:
   gro[i]=count
    count+=1
#print(gro)
sum=0
for ind,value in enumerate(names):
    #print(ind,value)
     temp=0
    for x in value:
       temp+=gro[x]
       print(temp)
    sum+=temp*(ind+1)
splitted = open('names.txt').read().replace('","',',').replace('"','').split(',')