I would suggest you use NumPy for anything that manipulates collections of numbers of the same type. A NumPy array is a more efficient container than a list in this case, an the package contain a large collection of tools to manipulate these arrays very efficiently.
For example, your code can be written as:
import numpy as np
from numpy.typing import NDArray
def except_zero(items: NDArray[np.int_]) -> NDArray[np.int_]:
output = items.copy() # can leave this out if you want to work in-place
nonzeros = output != 0
output[nonzeros] = np.sort(output[nonzeros])
return output
List comprehensions are powerful language constructs, but they tend to make code less readable. Especially if you nest them like this:
place_z = [i[0] for i in enumerate([i if i == 0 else 1 for i in items]) if i[1] == 0]
Separating such a line into two lines would improve readability:
binary = [i if i == 0 else 1 for i in items]
place_z = [i[0] for i in enumerate(binary) if i[1] == 0]
Though this doesn't really need two list comprehensions, the inner one doesn't add anything important, it just converts non-zeros to 1, but this is not required for the outer list comprehension logic, which only compares agains zero. So we can write this as:
place_z = [i[0] for i in enumerate(items) if i[1] == 0]
This last line is again better expressed as (thanks to J_H):
place_z = [i for i, v in enumerate(items) if v == 0]