I am a beginner at python. I have a code that reads a text file from my computer and converts all the text to int. I am struggling with the last few lines in the analyze golf scores function.
I need to tell the code that for a score under 280 to take these values and get the amount, which I know to use Len(score) for but I am going wrong with getting the values in the first place. It should print the number of scores below 180, but I keep getting errors and I am so lost! Any help is appreciated at all! Thank you so much!!!
My error is in the last six lines of code! I don't know how to get it to read the values under 280 in the list :(
The error is:
TypeError: '<' not supported between instances of 'str' and 'int'##
on the line:
if score < 280:
def open_and_read_golf_scores():
raw_scores = open("golfscores.txt", "r")
scores = []
for current_line in raw_scores:
values = current_line.split(",")
scores.append(values[2])
raw_scores.close()
return scores
def analyze_golf_scores():
scores = open_and_read_golf_scores()
total = 0
for score in scores:
score = score[0:3]
total = total int(score)
ave = total/len(score)
print("Average score =", ave)
for score in scores:
if score < 280:
scores.append(values)
below_par = total len(score)
print("The number of scores below par is ", below_par)
CodePudding user response:
This code looks problematic:
for score in scores:
score = score[0:3]
total = total int(score)
ave = total/len(score)
print("Average score =", ave)
for score in scores:
if score < 280:
scores.append(values)
below_par = total len(score)
print("The number of scores below par is ", below_par)
- The thing you're computing as
ave
is not the numeric average of the scores, it's the total divided by the number of digits in each score (which is 3). Is that what you meant to compute? Did you mean to divide bylen(scores)
instead? - Your
scores
are strings, and you're trying to compare them to the number280
, which is why you're getting thatTypeError
. You should convert them toint
as you did above, or better yet, haveopen_and_read_golf_scores
return them asints
in the first place. - Right after where you hit that error, you try to do something with
values
, which is unbound in this scope. Maybe you meant to usescore
?
A lot of problems will probably go away if your open_and_read_golf_scores
function just returns the scores as ints:
from typing import List
def open_and_read_golf_scores() -> List[int]:
with open("golfscores.txt", "r") as raw_scores:
return [
int(current_line.split(",")[2][:3])
for current_line in raw_scores
]
Note: I kept the logic of slicing each score
to its first three characters, but I have no idea why that's necessary because I can't see the contents of the file -- it feels like it might actually lead to a bug. Is every score really exactly three digits, with appropriate zero-padding? Is there some extra stuff after the score? What is that stuff? Could there be an safer way to get rid of it than making the assumption that the number is always 3 digits long?
Now your analyze_golf_scores
function can be much simpler, because you can do basic mathematical operations on scores
without having to convert each item in a loop:
from statistics import mean
def analyze_golf_scores() -> None:
scores = open_and_read_golf_scores()
ave = mean(scores)
below_par = sum(score < 280 for score in scores)
print(f"Average score = {ave}")
print(f"The number of scores below par is {below_par}")