Выброс индекса за пределы диапазона во время операции 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 за секунду цикла.

🤔 А знаете ли вы, что...
С Python можно создавать ботов для социальных сетей и мессенджеров.


50
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