Я хотел бы написать вспомогательную функцию, которая подсчитывает вхождения каждого целого числа от 0 до li[-1], говоря, что li — это отсортированный список.
Я не вижу своей ошибки... Я знаю, что означает такое сообщение об ошибке, но я не знаю, где переменная j достигает предела.
def aux_compter_occurence(li):
resu = [0] * (li[-1]+1)
i = 0
j = 0
while i < (li[-1] + 1):
while li[j] == i:
resu[i] += 1
j +=1
i += 1
return resu
Например, при вводе [2,4,4,4,7,8,8] вывод должен быть [0,0,1,0,3,0,0,1,2]
Я добавил в ваш код "j < len(li)", и теперь он работает.
def aux_compter_occurence(li):
resu = [0] * (li[-1]+1)
i = 0
j = 0
while i < (li[-1] + 1):
while j < len(li) and li[j] == i:
resu[i] += 1
j +=1
i += 1
return resu
collections.Counter
может быть передана итерируемая и будет подсчитывать каждое появление, затем мы можем использовать простое понимание для генерации результата
import collections
def aux_compter_occurence(li):
counts = collections.Counter(li)
return [counts.get(i, 0) for i in range(li[-1] + 1)]
Или, если вы хотите использовать предыдущий метод увеличения значений в списке, вы уже знаете индекс в списке, поскольку он равен целочисленному значению. Мы можем немного упростить
def aux_compter_occurence(li):
resu = [0] * (li[-1] + 1)
for i in li:
resu[i] += 1
return resu
Привет, марикерри. Как правило, на такие вопросы вы можете ответить сами, используя отладчик или стратегические
print
утверждения. Сообщение об ошибке, вероятно, будет содержать номер строки и, возможно, показывать точное местоположение ошибки. Хотя это здорово, что вы получаете ответы, этот вопрос довольно специфичен для вашего конкретного кода; это похоже на то, что мы делаем вашу домашнюю работу или выступаем в качестве ваших личных тестировщиков. Я так понимаю, это ваш первый вопрос, как и все остальные, кто его видит. Никто из важных людей не злится, и ты поправишься. Это просто к вашему сведению. Добро пожаловать в СО! :D