Почему я не могу заполнить sumcount в Counting Sort, используя понимание списка?

1
def countsort(alist):
    maxi=alist[0]

    for i in alist:
        if i>maxi:
            maxi=i

    indexlist=[i for i in range(0,maxi+1)]
    count=[alist.count(i) for i in indexlist]
    sumcount=[0 for i in range(0,maxi+1)]
    print(indexlist)
    print(count)

    sumcount=[count[i] if i==0 else count[i] + sumcount[i - 1]  for i in range(0, len(sumcount))]
    print(sumcount)

    sorted_input=[0 for i in range(0,len(alist)+1)]
    for i in alist:
        sorted_input[sumcount[i]]=i
        sumcount[i]-=1

    return sorted_input[1:]

#count output = [0,0,1,0,2,0,0,0,1,1,1]
#expected sumcount output = [0,0,1,1,3,3,3,3,4,5,6]
#sumcount output using list comprehension = count      

alist=[9,4,10,8,2,4]
s_l=countsort(alist)
print(s_l)

Проблема в том, что если я попытаюсь изменить sumcount, используя понимание списка, значения индекса не изменяются. Это почему? Почему я не могу одновременно изменять и получать доступ к значениям через понимание списка?

  • 0
    Можете ли вы объяснить, что этот код должен делать? Возможно, показав пример ввода и ожидаемого результата?
  • 0
    Это метод сортировки. Хорошо, я буду обновлять пост.
Теги:
list
sorting
list-comprehension
counting-sort

1 ответ

0

Я не могу беспокоить весь ваш код, но здесь разница между прокомментированным кодом и пониманием списка:

Когда вы sumcount[i - 1] доступ к sumcount[i - 1] в конструкции if/else, sumcount может быть уже обновлена с индексом i - 1.

Благодаря пониманию списка вы всегда sumcount на немодифицированную sumcount не sumcount ее при создании списка.

  • 0
    Здравствуйте, это моя проблема. При понимании списка sumcount не содержит ни одного из «предполагаемых вставленных значений». При правильном цикле значения вставляются правильно. Поэтому я предполагаю, что мой вопрос заключается в том, почему я не могу одновременно изменить и получить доступ к измененной сумме с пониманием списка?
  • 0
    @OrestesPapanastassiou, потому что вы создаете новый список с нуля с помощью понимания списка, а затем переназначаете имя sumcount на этот новый список. Вы не изменяете старый sumcount пока выполняется понимание списка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню