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