Как найти диапазон, среднее и три верхних значения из этого списка без TypeError? - PullRequest
0 голосов
/ 04 марта 2019

Я новичок в Python и работаю над небольшим проектом:

90, 75, 65, 50, 40 - оценки ниже

Мой код:

grade1 = int(input("Enter grade 1:"))
grade2 = int(input("Enter grade 2:"))
grade3 = int(input("Enter grade 3:"))
grade4 = int(input("Enter grade 4:"))
grade5 = int(input("Enter grade 5:"))

numbers = [grade1,grade2,grade3,grade4,grade5]
sorted_grades = sorted(numbers)
topthree = sorted_grades[-1,-2,-3]

Однако при запуске topthree я получаю сообщение об ошибке:

TypeError: списочные индексы должны быть целыми числами или кусочками, а не кортежем

Как мне избежать этого?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Предполагая, что вы уже собрали оценки в список под названием grades:

# New list of sorted entries
sorted_grades = sorted(grades)

# Sum of all list entries divided by the length
average = sum(grades)/len(grades)
# Last entry minus the first entry
range = grades[-1] - grades[0]
# Slice from the third-to-last entry to the end of the list
top_three = grades[-3:]

Синтаксис, такой как отрицательное индексирование и нарезка, обсуждается далее в учебнике , приведенном в документации CPython :

Как и строки (и все другие встроенные типы последовательностей), списки могут быть проиндексированы и нарезаны:

>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
>>> squares[0]  # indexing returns the item
1
>>> squares[-1]
25
>>> squares[-3:]  # slicing returns a new list
[9, 16, 25]

Все операции срезов возвращают новый список, содержащийзапрошенные элементы.Это означает, что следующий фрагмент возвращает новую (мелкую) копию списка:

>>> squares[:]
[1, 4, 9, 16, 25]

Общий формат индексации / нарезки списка: some_list[start:stop:step]:

>>> numbers = [1,3,5,7,9]
>>> numbers[0:3]  # slice from the first element to the third
[1, 3, 5]
>>> numbers[:3]  # 0's can be omitted
[1, 3, 5]
>>> numbers[1:3]  # slice from the second element to the third
[3, 5]
>>> numbers[3:]  # slice from the third element to the end
[7, 9]
>>> numbers[-3:]  # slice from the third-to-last to the end
[5, 7, 9]
>>> numbers[::-1]  # slice of the whole list, stepping backward by 1 for each entry
[9, 7, 5, 3, 1]
>>> numbers[1::2]  # slice of every other entry, starting with the second
[3, 7]

Обратите внимание, что фрагменты списка исключают конец, поэтому numbers[1:2] возвращает только вторую запись: [3].

0 голосов
/ 04 марта 2019

Python использует : символ для нарезки списка.Поэтому вместо использования topthree = sorted_grades[-1,-2,-3] используйте topthree = sorted_grades[-1:-4:-1].Формат для нарезки списка: [start:stop:step].

0 голосов
/ 04 марта 2019

Вам нужно использовать нарезку списка следующим образом:

topthree = sorted_grades[:-4:-1]

Я знаю, что это говорит -4, но это занимает первые три.

Если вы хотите использовать список,это займет немного больше усилий:

indices = [-1, -2, -3]
topthree = [sorted_grades[i] for i in indices]

Вы также можете отсортировать в обратном порядке:

sorted_grades = sorted(numbers, reverse=True)
topthree = sorted_grades[:3]
...