Невозможно назначить результат map () для двумерного списка - PullRequest
0 голосов
/ 14 февраля 2019

Приведенный ниже код предназначен для взятия набора строк меток учеников в массиве, и нужно найти строку с максимальными оценками.
Ниже приведен неполный код, так как нужно еще искать строку максимальной суммы;но застрял в неполном коде из-за ошибки.

Это выдает ошибку ниже в py3.codeskulptor.org / , в то время как в Pythontutor , программа завершается в то же самоеномер строки.

Строка № 17: IndexError: индекс назначения списка вне диапазона

# Input number of tests 
t = int(input("Input number of tests")) 

# Input size of rows (of students) 
n = int(input("Input size of rows"))#.strip().split()) 
print (t,n)

arr = [[[] for i in range(t)] for i in range(n)] 
total = [[] for i in range (n)]  

for i in range(0,t): 

    # Input score of each student in row     
    sum =0    
    for j in range(n):
        arr[i][j] = map(int, input("Input score").strip().split())#[:n]
    #the above line causes compilation error

    # Find sum of all scores row-wise 
    for m in arr[i][j]:
        sum += m
    total[i] = sum1

# Find the max. of total
for j in range(t): 
    y = max(total[j])

Просьба также предложить более четкий подход к программевышеуказанная проблема.

PS Я обнаружил, что приведенный выше код был почти неправильным, но ударил меня в правильном направлении.
Иметь модифицированный код ниже с вопросом, который возник во время отладки и касался:

max (), отдавая [] приоритет над целым значением

Такое поведение max () было обнаружено, когда неправильно задана строка # 13 как:

total = [[[] для i в диапазоне (l)] для i в диапазоне (n)]

Ниже приведен правильный рабочий код с выводом here:

# Input number of tests 
t = int(input("Input number of tests")) 

# Input number of rows (of students) 
n = int(input("Input number of rows"))#.strip().split()) 

# Input limit on number of students in a row (of students) 
l = int(input("Input max. number of studentsin any row"))#.strip().split()) 

print ('t :',t,'n :',n, 'l :', l)

arr = [[[[] for i in range(l)] for i in range(n)] for i in range(t)]
total = [[[] for i in range (n)] for i in range (t)]  

# run input of tests 
for i in range(t):   
    # Input score of each student in the i-th row, out of n   
    sum =0 
    for j in range(n):
        #for k in range(l):
        print("jkl:","i:",i,"j:",j)
        arr[i][j] = map(int, input("Input score").strip().split())[:l]


for i in range(t): 
    for j in range(n):
        # Find sum of all scores row-wise 
        sum = 0
        for m in arr[i][j]:
            #sum[i][j][] += m
            print ('m :', m)
            sum += m

        #total[i][j] = sum[i][j][]
        total[i][j] = sum

for i in range(t):
    print("Test no. ", i)
    for j in range(n):
        #for m in arr[i][j]:
        print (arr[i][j])
            #print (m)
    print("=========")

for i in range(t): 
    for j in range(n):
        print(i,"-",j, total[i][j])
    print("::::::")
print("=========")

# Find the max. of total
for i in range(t): 
     print([m for m in total[i]])
     y = max([m for m in total[i]])
     print ('i:',i,',', 'max total:',y)

Запросить причину для приоритета, указанного в max (),и, если возможно, свяжите ответ с некоторой ссылкой на базовую реализацию в CPython.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вы делаете ошибку между t и n

я должен быть в range(n)

, а j должен быть в range(t)

0 голосов
/ 14 февраля 2019
arr = [[[] for i in range(t)] for i in range(n)] 

Учитывая приведенную выше конструкцию arr, вы поменяли местами t и n во вложенных циклах:

for i in range(t):
    # …
    for j in range(n):
        arr[i][j] = …

Первый индекс в arr (соответствующий внешнему циклу ) должен быть числом от 0 до n –1.

Второй индекс в arr (соответствует внутренней петле) должно быть числом от 0 до t –1.

...