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)
就这些。也许有更快的方法,这是我第一次想到的
希望有帮助
弗朗西斯科