#python #string #dictionary #average
#python #строка #словарь #среднее
Вопрос:
У меня есть строка, которая выглядит следующим образом
s = """nate : 9.5 ,8 ,5 ,8.7
moe : 7 ,6.8 , - ,1
sam : 6 ,4 , ,7.6
cat : 8 ,8.6 ,6 ,2"""
для dash (-) его следует просто полностью удалить, например: 6.8, — , 1 должно стать 6.8,1
для пустых частей, вместо этого должно быть 0 для ex 4, , 7,6 должно стать 4,0, 7,6
после того, как все будет сделано, я хочу рассчитать среднее значениекаждый человек и отобразить его в виде словаря
это то, что я придумал, и мне не удалось продвинуться дальше
def avg(s):
s = s.replace(" - ,", ""). replace(", ,", ", 0 ,")
s= s.strip().splitlines()
students={}
for i in s:
s = i.strip().split(":")
students[s[0]]= s[1].strip().split(",")
Ответ №1:
Перебирайте оценки, пропуская -
, заменяя пустые строки 0
и преобразуя остальные в значения с плавающей запятой. Затем вычислите среднее значение путем деления на длину и сохраните его в students
словаре.
Проще заменить отдельные элементы списка, чем заменять в исходных строках, поскольку ваш интервал непоследователен.
def avg(s):
s= s.strip().splitlines()
students={}
for i in s:
s = i.split(":")
student = s[0].strip()
scores = [x.strip() for x in s[1].split(",")]
scores = [float(score) if score else 0 for score in scores if score != "-"]
students[student] = sum(scores) / len(scores) if scores else 0
Комментарии:
1. вы, вероятно, имели в виду использовать
x.strip()
в строкеscores = [strip(x) for x in s[1].split(",")]
2. Я забыл упомянуть в своем вопросе, но я также хочу удалить самую низкую оценку для каждого человека перед вычислением среднего значения, пожалуйста, покажите мне, как это сделать
3. Отсортируйте список, затем используйте фрагмент, начинающийся с элемента 1.
sorted(scores)[1:]
Ответ №2:
# split s into lines and iterate over each line
for line in s.splitlines():
# init num_scores and total to zero for this student
num_scores = 0
total = 0.0
# get the name and the scores
name, scores = line.split(" : ")
# split scores on commas and iterate over each score
for score in scores.split(","):
# remove whitespace
score = score.strip()
# if we have something and it's not a dash
if score and score != "-":
num_scores = 1
total = float(score)
# print this student's name and average
print(f"{name}: average score {total/num_scores}")