Получение этой ошибки: TypeError: можно объединить только список (не «int») в список

#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
  

Цикл не включает первую и последнюю строки, поэтому вы не будете включать углы дважды.