Проблема с реализацией алгоритма сортировки подсчетом

Я пытаюсь научить себя нескольким алгоритмам сортировки в python, и у меня возникают небольшие проблемы с выводом. Я пытаюсь реализовать алгоритм сортировки подсчета, и я зашел так далеко:

def counting_sort(l):
    nums = l
    highest = max(nums) + 1
    helper_list = [0] * highest
    s_list = []
    for i in range(len(nums)):
        value = nums[i]
        helper_list[value] += 1

    for j in range(len(helper_list)):
        s_list.append([j] * helper_list[j])

    return s_list

Все идет почти нормально, но когда я ввожу ввод, например [5, 2, 2, 3, 1, 2].

Я получаю вывод вроде: [[], [1], [2, 2, 2], [3], [5]].


person Cameron    schedule 28.01.2017    source источник


Ответы (2)


Вам просто нужно изменить «добавить» на «расширить». Функция добавления добавляет элемент в ваш список, в данном случае другой список. Функция расширения объединяет ваш список со списком, заданным в качестве параметра.

Ваша функция должна выглядеть следующим образом:

def counting_sort(elements):
     highest = max(elements) + 1
     helper_list = [0] * highest
     s_list = []
     for value in elements:
         helper_list[value] += 1

     for j in range(len(helper_list)):
         s_list.extend([j] * helper_list[j])

     return s_list
person Jorge Plaza    schedule 28.01.2017
comment
Спасибо добрый сэр! Это решило мою проблему. Таким образом, расширение конкатенирует со значением, а добавление объединяется со списком значений? - person Cameron; 28.01.2017
comment
Пожалуйста. s_list.append(x) добавит x (это может быть список, целое число или что-то еще) в s_list. Вы можете изменить свой код, чтобы использовать добавление, если вы вставляете каждый элемент отдельно, а не в виде списка, и он будет продолжать работать. - person Jorge Plaza; 28.01.2017

Проблема в строке:

s_list.append([j] * helper_list[j])

Это говорит о добавлении списка ([j]*helper_list[j]) к s_list, добавляя этот список как новый элемент или s_list.

Вместо этого вы хотите добавить один список в другой, что можно сделать так:

s_list.append += ([j] * helper_list[j])
person Scott Hunter    schedule 28.01.2017