Более эффективный подход, который решает проблему в O (n) сложности времени, заключается в сохранении индексов нулей в наборе, сортировке остальных элементов, а затем итерации индекса по длине из списка ввода для вывода нулей, если индекс находится в наборе, или следующий элемент в отсортированном списке, если нет:
def except_zero(items):
zeroes = {i for i, v in enumerate(items) if v == 0}
others = iter(sorted(v for v in items if v != 0))
return [0 if i in zeroes else next(others) for i in range(len(items))]
, так что:
except_zero([5,3,0,0,4,1,4,0,7])
возвращает:
[1, 3, 0, 0, 4, 4, 5, 0, 7]