Как исправить ошибку «индекс вне диапазона» в Python?

Я хотел бы написать вспомогательную функцию, которая подсчитывает вхождения каждого целого числа от 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]

Привет, марикерри. Как правило, на такие вопросы вы можете ответить сами, используя отладчик или стратегические print утверждения. Сообщение об ошибке, вероятно, будет содержать номер строки и, возможно, показывать точное местоположение ошибки. Хотя это здорово, что вы получаете ответы, этот вопрос довольно специфичен для вашего конкретного кода; это похоже на то, что мы делаем вашу домашнюю работу или выступаем в качестве ваших личных тестировщиков. Я так понимаю, это ваш первый вопрос, как и все остальные, кто его видит. Никто из важных людей не злится, и ты поправишься. Это просто к вашему сведению. Добро пожаловать в СО! :D

Mike 28.05.2019 01:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
118
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Другие вопросы по теме