Выброс индекса за пределы диапазона во время операции pop в списке Python

Я пытаюсь отсортировать в списке только положительные целые числа и вставить их перед отрицательными целыми числами и нулем, если таковые имеются. Я не хочу менять порядок отрицательных/нулевых элементов.

Это код, который я пишу, но он выдает ошибку индекса, когда я пытаюсь удалить положительные элементы из исходного списка после того, как положительные элементы отсортированы в другом списке.

enter code here #sortonlypositivenumbers 
def solve(n, nums):
 positive = []
 for i in range(n):
  if nums[i] > 0:
   positive.append(nums[i])
  positive.sort()
 for i in range(n):
  if nums[i] > 0:
   nums.pop(i)
 nums = positive + nums
return nums

arr = list(map(int, input("Enter array separated by spaces.").split()))
length = len(arr)
print(solve(length, arr)) 

Вывод показывает: IndexError: индекс списка выходит за пределы диапазона для оператора if nums[i]>0 за секунду цикла.

предоставить образец входных данных и ожидаемый результат

eshirvana 06.09.2024 15:46

Отступ в 1 символ затрудняет чтение кода и облегчает случайное появление ошибок. Рекомендую Отступ PEP8.

jarmod 06.09.2024 15:53

Какой у тебя вопрос? Вы ничего не спросили.

no comment 06.09.2024 16:16
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отметил Джон Гордон, вызов nums.pop(i) удаляет i-й элемент nums, делая его короче. Поскольку n — это начальная длина nums, цикл for продолжает обход новой (более короткой) длины nums и, таким образом, выдает ошибку выхода индекса за диапазон.

Чтобы избежать этой проблемы, вы можете решить проблему с помощью одного цикла по списку, где вы сортируете значения на положительные и неположительные значения, сортируете положительные значения, а затем объединяете два списка, чтобы получить желаемый результат (обратите внимание, что вы не можете больше нужна длина в качестве входных данных для функции):

def solve(nums):
    positives, non_positives = [], []
    for num in nums:
        if num > 0:
            positives.append(num)
        else:
            non_positives.append(num)
    positives.sort()
    return positives + non_positives

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