#python #list #typeerror
#python #Список #ошибка типа
Вопрос:
Я пытаюсь написать эту программу для вычисления периметра 2d-списка (в основном рассматривая его как прямоугольник), и я продолжаю получать эту ошибку. Мне также нужна помощь в том, чтобы выяснить, как суммировать столбцы «прямоугольника», не добавляя углы дважды. Заранее благодарим вас за помощь
def perimeter_sum(arr2d):
col_sum=0
first_row=arr2d[0]
last_row=arr2d[-1]
for i in range(len(arr2d)):
col_sum=arr2d[1 i][0] arr2d[1 i][-1]
sum = first_row last_row col_sum
return sum
a2d = [[1,2,3,4],[5,6,7,9],[9, 0, 1,2]] #error occurred here
perimeter_sum(a2d)
Комментарии:
1. Опубликуйте полную обратную трассировку.
2. Ошибка почти наверняка исходит от
sum = first_row last_row col_sum
.first_row
иlast_row
являются списками,col_sum
это число. Что вы ожидаете, что это дополнение вернет?3.
arr2d[1 i]
на последней итерации цикла появится ошибкаfor
. Почему вы добавляете 1?4. о, я вижу, извините, я все еще учусь
5.
first_row
иlast_row
оба являются списками, аcol_sum
число. При применении к двум спискам оператор » » объединяет их в новый, более длинный список, такfirst_row last_row
что список. Попытка добавленияcol_sum
в этот список приводит к ошибке, поскольку вы не можете применитьоператор к списку и числу.
Ответ №1:
Итак, ошибка, которую вы получаете, заключается в том, что вы пытаетесь добавить строки (first_row и last_row) к скалярному значению int (col_sum), следовательно, невозможно добавить объединенный список, а не int .
Чтобы получить периметр 2D-массива, вы можете просуммировать последнюю и первую строку, а также последний и первый столбцы, как вы пытались, а затем вычесть углы в конце, если нет конкретной причины, по которой вы не можете этого сделать. Что-то вроде:
def perimeter_sum(arr2d):
first_row = sum(arr2d[0])
last_row = sum(arr2d[-1])
first_col = sum([arr2d[i][0] for i in range(len(arr2d))])
last_col = sum([arr2d[i][-1] for i in range(len(arr2d))])
# sum with double counted corners
s = sum([first_row, last_row, first_col, last_col])
# decrement once for each corner
return (s - arr2d[0][0] - arr2d[0][-1] - arr2d[-1][0] - arr2d[-1][-1])
Ответ №2:
Вы можете использовать sum()
для получения общего количества списка. Используйте это для суммирования первой и последней строк. Затем перебирайте промежуточные строки и добавляйте первый и последний элементы.
def perimiter_sum(arr2d):
sum = sum(arr2d[0]) sum(arr2d[-1])
for row in arr2d[1:-2]:
sum = row[0] row[-1]
return sum
Цикл не включает первую и последнюю строки, поэтому вы не будете включать углы дважды.