Сумма списка Python + удаление строк из списка - PullRequest
0 голосов
/ 04 октября 2019

У меня проблема с тем, что мне нужно взять пользовательский ввод, т. Е. (Джек, 10,10,9,10,10), где Джек - имя студента, а цифры - результаты тестов. Мне нужно найти среднее значение этих тестов и напечатать их с именем студента. Эта проблема кажется очень простой, я получаю ошибку вывода, которая говорит:

>>> calcMarks()
Enter marks:Jack,10,10,9,10,10
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
calcMarks()
File "xyz", line 12, in calcMarks
avg = sum(list[0:len(list)])
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> 

Вот мой код:

def calcMarks():
    #input = Jack,10,10,9,10,10
    userInput = input('Enter marks:')
    list = userInput.split(',')
    name = list.pop(0)
    #print(type(list))
    #print(type(name))
    avg = sum(list)/(len(list)-1)
    print(name + ' ' + avg)

Ответы [ 6 ]

4 голосов
/ 04 октября 2019

avg - это число. Чтобы объединить его с другими строками, его нужно сначала превратить в строку с str()

. Кроме того, вы суммируете строки, которые перед суммированием необходимо преобразовать в числа.

def calcMarks():
    #input = Jack,10,10,9,10,10
    userInput = input('Enter marks:')
    l = userInput.split(',')
    name = l.pop(0)
    l = [int(x) for x in l]
    avg = sum(l)/len(l)
    print(name + ' ' + str(avg))
3 голосов
/ 04 октября 2019

Проблема вашего подхода в том, что при чтении из input вы всегда получите строку, поэтому вам придется приводить целые числа к меткам для вычисления среднего значения. Вот как бы я это сделал:

def calcMarks():
    # unpack the input into user and marks
    # having split the string by ','
    user, *marks = input('Enter marks:').split(',')
    # take the average of the marks cast to int 
    avg_mark = sum(map(int,marks))/(len(marks))
    # you can use f-strings to print the output
    print(f'{user} has an average of {avg_mark}')
    # print('{} has an average of {}'.format(user, avg_mark)) # for python 3.5<

calcMarks()

Enter marks:Jack,10,10,9,10,10
Jack has an average of 9.8
0 голосов
/ 04 октября 2019

Вы можете взять имя пользователя и метки в двух переменных, одна простая строка, а другая список строк. Затем вы можете перейти к среднему, так как вы уже отделили имя от чисел. Если я не ошибаюсь, тогда это должно хорошо сработать.

def calcMarks():
    # input Jack, <marks>...
    name, marks = input("Enter Marks"), map(int, input().split(", "))
    average = sum(marks) / len(marks)
    print(name + ' ' + str(average))
0 голосов
/ 04 октября 2019

Если вы хотите получить вывод функции, которая возвращает значение int или float, вы можете добавить , вместо + в print1:

def calcMarks():
    #input = Jack,10,10,9,10,10
    userInput = input('Enter marks:')
    inputs = userInput.split(',')
    name = inputs.pop(0)
    input_list = [int(i) for i in inputs]
    #print(type(list))
    #print(type(name))
    avg = sum(input_list)/(len(input_list))
    print(name + ' ',avg)
calcMarks()

Вывод:

Enter marks:Jack,10,10,9,10,10
Jack  9.8
0 голосов
/ 04 октября 2019

String concetanation работает только тогда, когда переменная должна быть объединена с same data type.

print(name + ' ' + str(avg))
0 голосов
/ 04 октября 2019
def calcMarks():
    #input = Jack,10,10,9,10,10
    userInput = input('Enter marks:')
    l = userInput.split(',')[1:]
    #print(type(list))
    #print(type(name))
    return sum(map(int, l))/(len(l))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...