python中除零之外的列表排序

python中除零之外的列表排序,python,list,sorting,Python,List,Sorting,我有一个列表[5,3,0,0,4,1,4,0,7] 我想以某种方式对列表进行排序,使零保持在它们的位置,其他的被排序答案如下[1,3,0,0,4,4,5,0,7] 我写了这段代码,但我无法修复零的位置 def except_zero(items: list) -> Iterable: ans=[] for i in range(len(items)): if (items[i] != 0): ans.append(items[

我有一个列表
[5,3,0,0,4,1,4,0,7]
我想以某种方式对列表进行排序,使零保持在它们的位置,其他的被排序答案如下
[1,3,0,0,4,4,5,0,7]

我写了这段代码,但我无法修复零的位置

def except_zero(items: list) -> Iterable: 
    ans=[] 
    for i in range(len(items)): 
        if (items[i] != 0): 
            ans.append(items[i]) 
            ans = sorted(ans) 

    j = 0 
    for i in range(len(items)): 
        if (items[i] >= 0): 
            items[i] = ans[j] 
            j += 1 
            return ans

不优雅,但似乎有效:

l_in=[5,3,0,0,4,1,4,0,7]
l_out=[]
#获取并排序所有非零值
nonz=已排序([x表示x在l_中,如果x!=0])
#构建新列表,如果其中有一个列表,则添加一个零
#位置,否则弹出排序中的第一项
#非零列表
对于范围内的i(len(l_in)):
l_out.append(如果l_in[i]==0,则为0,否则为非z.pop(0))
打印(打印)
您可以尝试以下方法:

def sort_and_extract_non_zero_items(items: list) -> Iterable:
  return sorted([n for n in l if n != 0])

def replace_non_zero_items(original: list, non_zeroes: list) -> Iterable:
  return [non_zeroes.pop(0) if n != 0 else 0 for n in original]

non_zero_list = sort_and_extract_non_zero_items(items)

items = replace_non_zero_items(items, non_zero_list)
类似上面的方法可以工作,您只需存储非零值的索引位置,然后将排序后的值放入相应的索引位置

如果您解决了几个问题,甚至您自己的方法也可以工作,例如:

def except_zero(items: list) -> Iterable: 
    # get and sort non zero values
    non_zero = list(sorted([x for x in items if x!=0]))
    j = 0 
    # place them in correct position
    for i in range(len(items)): 
        if (items[i] != 0): 
            items[i] = non_zero[j]  # get next sorted non_zero value for this position
            j += 1 # update index

    return items
我会:

orig_list = [5,3,0,0,4,1,4,0,7]
result = sorted([i for i in orig_list if i!=0])
for inx, elem in enumerate(orig_list):
    if elem == 0:
        result.insert(inx, 0)
print(result)  # [1,3,0,0,4,4,5,0,7]

首先我对非零进行排序,然后在
结果
列表中出现的位置插入零

解决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]

应首先保存零值的索引位置:

zero_positions = [i for i, this in enum(mylist) if this == 0]
ordered = [this for this in mylist if this != 0].sorted()
然后,您可以在不使用零值的情况下对列表进行排序:

zero_positions = [i for i, this in enum(mylist) if this == 0]
ordered = [this for this in mylist if this != 0].sorted()
最后,您可以在正确的位置插入零:

for i in zero_positions:
    ordered.insert(i, 0)
就这些。也许有更快的方法,这是我第一次想到的

希望有帮助 弗朗西斯科