Я пытаюсь сделать выбор отбора, используя Python, я только недавно выучил Python, следуя за книгой «Курс Python Carm», то теперь я читаю книгу «Гроккинг алгоритмы»

Я хорошо разбирался в алгоритме сортировки выбора, но не могу понять, почему я получаю TypeError: 'NoneType' object cannot be interpreted as an integer

Таким образом, я проверяю, это заполнить мой массив, используя random.randint(1, 101) и range(0,11), а range(0,11), что я не могу понять, почему python не может интерпретировать его как целое число? Поскольку обе функции возвращают целое число. Ошибка, кажется, происходит, когда я делаю new_array.append(arr.pop(smallest)).

См. мой полный код ниже. (Я использую Python 3)

import random

def find_smallest(arr):
    """Return the index of the smallest value in an array"""
    smallest = arr[0]
    smallest_index = 0

    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
        return smallest_index

def selection_sort(arr):
    """sort an array by storing smallest value to new array 1 by 1"""
    new_array = []
    for i in range(len(arr)):
        smallest = find_smallest(arr)
        new_array.append(arr.pop(smallest))
    return new_array


my_array = []
for i in range(0, 11):
    my_array.append(random.randint(1, 101))
    print(my_array[i])

sorted_array = selection_sort(my_array)
for i in range(len(sorted_array)):
    print(sorted_array[i])
0
Darren 17 Мар 2018 в 08:00

1 ответ

Лучший ответ

Похоже на проблему с отступом в вашей функции find_smallest()

Рассмотреть возможность

def find_smallest(arr):
    """Return the index of the smallest value in an array"""
    smallest = arr[0]
    smallest_index = 0

    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index  # <--- this is the line

Обратите внимание, что оператор {return отступает иначе, чем в вашем коде.

Для отладки таких проблем вы должны заметить, что arr.pop() требует в качестве аргумента целое число или список целых чисел, поэтому вы можете вставить

 assert(smallest is not None)

Над несоблюденной строки new_array.append(arr.pop(smallest)) и подтвердить, что утверждение запускается, то проверьте, в какую итерацию это происходит замена утверждения Assert с

 assert(smallest is not None), "Array length is %d" % len(arr)

Это вызовет исключение

 AssertionError: Array length is 1

Тогда вы бы знали, что вам нужно проверить, что возвращает функцию {find_smallest, когда его аргумент представляет собой массив длины 1.

1
Dmitri Chubarov 17 Мар 2018 в 09:01