2016-12-07 1 views
-1

Я пытаюсь реализовать quicksort в python. Вот мой код:Python не может объединить списки, потому что они включают элементы nonetype

def quicksort(numbers): 
    less = [] 
    is_pivot = [] 
    larger = [] 

    if len(numbers) > 1: 
     pivot = numbers[0] 
     for x in numbers: 
      if x < pivot: 
       less.append(x) 
      elif x == pivot: 
       is_pivot.append(x) 
      else: 
       larger.append(x) 
     sorted_list = quicksort(less) + is_pivot + quicksort(larger) 
     print(sorted_list) 
    else: 
     print(numbers) 

Это дает мне следующее сообщение об ошибке:

File "sortingalgorithms.py", line 101, in <module> 
quicksort(numbers) 
File "sortingalgorithms.py", line 66, in quicksort 
sorted_list = quicksort(less) + is_pivot + quicksort(larger) 
File "sortingalgorithms.py", line 66, in quicksort 
sorted_list = quicksort(less) + is_pivot + quicksort(larger) 
TypeError: unsupported operand type(s) for +: 'NoneType' and 'list' 

Когда я пытаюсь напечатать списки без конкатенации их я получаю следующий вывод для списка с номерами 3, 2,1

[1.0] 
[] 
[None, [2.0], None] 
[] 
[None, [3.0], None] 

Откуда берутся элементы nonetype, и как я могу решить свою проблему? Благодаря

+1

У вас нет 'return' заявление, так что ваша функция возвращает' None' –

ответ

1

Хорошо, так что проблема исходит исключительно от этой строки:

sorted_list = quicksort(less) + is_pivot + quicksort(larger) 

Подумайте внимательно здесь, ваша функция ничего не возвращает. Поэтому quicksort(less) и quicksort(larger) вернутся None.

Поэтому sorted_list становится [None, [2.0], None]

В принципе, заменить print линии с return заявления, а затем распечатать вне функции.

Вот мое решение:

def quicksort(numbers): 
    less = [] 
    is_pivot = [] 
    larger = [] 

    if len(numbers) > 1: 
     pivot = numbers[0] 
     for x in numbers: 
      if x < pivot: 
       less.append(x) 
      elif x == pivot: 
       is_pivot.append(x) 
      else: 
       larger.append(x) 
     sorted_list = quicksort(less) + is_pivot + quicksort(larger) 
     return sorted_list # Replaced print statement here. 
    else: 
     return numbers # Replaced print statement here. 

print(quicksort([1,3,4,2,5,0])) 
+0

Итак, как я понимаю, я должен изменить свою строку, которая должна печатать отсортированный список вместо оператора return? потому что я попробовал именно это, и у меня такая же ошибка. Итак, теперь вместо print (sorted_list) я возвращаю sorted_list – Brian

+0

Пожалуйста, см. Полное решение, которое я только что добавил. Я заменил все операторы печати (включая базовый случай, найденный в инструкции 'else'), с операторами return, и он работает нормально. –

+0

Ах, проблема в том, что я не делал оператора return в инструкции else. Спасибо! – Brian

0

Ваша функция возвращает None в данный момент вам нужно вернуть что-то вроде этого:

def quickSort(numbers): 
    less = [] 
    is_pivot = [] 
    larger = [] 

    if len(numbers) <= 1: 
     return numbers 
    else: 
     pivot = numbers[0] 
     for x in numbers: 
      if x < pivot: 
       less.append(x) 
      elif x > pivot: 
       larger.append(x) 
      else: 
       is_pivot.append(x) 
     less = quickSort(less) 
     larger = quickSort(larger) 
     return less + is_pivot + larger 

test = [87, 3, 42, -893, -5, 107, 3, 27, 0] 
test = quickSort(test) 
print(test) 

Выход:

[-893, -5, 0, 3, 3, 27, 42, 87, 107] 

Попробуйте here!

+0

downvoted, потому что вы на самом деле не _explained_, что было неправильным. –

Смежные вопросы