Я пытаюсь отсортировать в списке только положительные целые числа и вставить их перед отрицательными целыми числами и нулем, если таковые имеются. Я не хочу менять порядок отрицательных/нулевых элементов.
Это код, который я пишу, но он выдает ошибку индекса, когда я пытаюсь удалить положительные элементы из исходного списка после того, как положительные элементы отсортированы в другом списке.
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 за секунду цикла.
Отступ в 1 символ затрудняет чтение кода и облегчает случайное появление ошибок. Рекомендую Отступ PEP8.
Какой у тебя вопрос? Вы ничего не спросили.
Как отметил Джон Гордон, вызов 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
предоставить образец входных данных и ожидаемый результат