所以我在这里所做的是打开文本文件scores,strip,替换('\n,''(,然后将文本文件的行读取到分数中变量列表(输出以分数表示(。我正试图分开分数中的每一行,并将第一项放在该行的字母和第二个项目将作为整数在分数中铸造。然后我想测试我的函数接收用户的字母输入,然后输出其相应的分数。
def getLetterScore():
with open("scores","r") as file:
scores = [[line.strip().replace('n','') for line in file.readlines()]]
letters_to_points = []
for line in scores:
line = line.split()
letter = line[0]
score = int(line[1])
letters_to_points.append([letter,score])
scores.close
letter = input("Enter a letter: ")
for item in scores:
if item[0]==letter.upper():
print("The corresponding score is:",(item[1]))
updated code:
def getletterscore():
with open("scores","r") as file:
Scores = [line.strip().replace('n','') for line in
file.readlines()]
letters_to_scores = []
for line in Scores:
print(line)
line = line.split("")
letter = line[0]
score = int(line[1])
letters_to_scores.append([letter,score])
letter=输入("输入一个字母:"(对于letter_to_scores中的项目:如果项[0]==letter.opper((:打印("对应的分数是:",(项目[1]((
然而,它们并不是从这一代码体中打印出来的输出。编译器跳过到下一行。你知道我的代码有什么问题吗?
update=我已经更新了上面的代码,但我的输出仍然有问题——它只是在我删除def getletterscore时才开始输入一个值,并且我输入的输入字母的输出无关紧要,因为它按顺序打印。
scores = ['A 1', 'B 3', 'C 5', 'D 3', 'E 1', 'F 5', 'G 4', 'H 3', 'I 1', 'J
10', 'K 8', 'L 3', 'M 5', 'N 3', 'O 2', 'P 5', 'Q 20', 'R 3', 'S 3', 'T 2', 'U
1', 'V 10', 'W 12', 'X 16', 'Y 8', 'Z 20']
你确定你已经运行了你的代码吗?
由于您已经将其作为一个函数,因此需要确保在定义函数后在某个地方调用getLetterScore()
。
然而,这并不是故事的结束——代码中仍然存在一些问题。
对于这样的项目,我建议在各处添加一堆打印语句,以便更好地了解正在发生的事情,例如:
def getLetterScore():
with open("scores","r") as file:
scores = [[line.strip().replace('n','') for line in file.readlines()]]
# lets see what kind of data we have in scores
print(scores)
letters_to_points = []
for line in scores:
# lets have a look over what we are iterating over
print(line)
line = line.split()
letter = line[0]
score = int(line[1])
letters_to_points.append([letter,score])
scores.close
letter = input("Enter a letter: ")
for item in scores:
if item[0]==letter.upper():
print("The corresponding score is:",(item[1]))
getLetterScore() # <- remember you need to call this!
有了它,应该可以更容易地调试代码并查看问题所在。
假设我们有一个文件:
A 1
B 2
C 3
如果我们运行代码,我们得到:
[['A 1', 'B 2', 'C 4']]
['A 1', 'B 2', 'C 4']
Traceback (most recent call last):
File "stack.py", line 20, in <module>
getLetterScore()
File "stack.py", line 9, in getLetterScore
line = line.split()
AttributeError: 'list' object has no attribute 'split'
让我们试着一步一步地把它分解。
第一行[['A 1', 'B 2', 'C 4']]
向我们展示了scores
变量实际上是一个列表列表。所以当我们这样做时:
for line in scores:
print(line)
我们只得到一个值为['A 1', 'B 2', 'C 4']
的打印语句
这立即解释了line = line.split()
的问题,因为我们试图拆分列表而不是字符串。
那么我们该如何解决这个问题呢?
scores = [line.strip().replace('n','') for line in file.readlines()]
是对平面列表进行列表理解的正确方法。
进行此更改并重新运行代码,我们将获得新的输出:
['A 1', 'B 2', 'C 4']
A 1
Traceback (most recent call last):
File "stack.py", line 20, in <module>
getLetterScore()
File "stack.py", line 13, in getLetterScore
scores.close
AttributeError: 'list' object has no attribute 'close'
现在线路scores.close
是错误的,原因有几个:
- 您不能关闭列表
- 如果要关闭打开的文件,则需要执行
file.close()
(注意括号,因为它是方法而不是属性( - 使用上下文管理器消除了关闭文件的需要
我最后一点的意思是,如果没有with
语句,您将不得不执行:
file = open('scores')
# ... do stuff to file
file.close() # at the end of using the file
但是with语句会自动为您执行以下操作:
with open('scores') as f:
# ... do stuff to file
# here the file is automatically closed
基本上我们只需移除scores.close
线
现在,如果我们运行代码。。。。
['A 1', 'B 2', 'C 4']
A 1
B 2
C 4
Enter a letter:a
a
The corresponding score is:
我们没有任何产出。
原因是您正在对scores
而不是letters_to_points
进行迭代,所以在第3行到最后一行中替换它可以得到您想要的代码。