вычислить среднее значение из входных данных, которые являются строкой

#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}")