首页 > 解决方案 > Python排序无忽略(或稳定)

问题描述

我有列表,其项目要么是数字,要么是None.

我想对它们进行排序,以便None项目保持在同一个位置,同时对数值进行排序。

例如,我想要这个列表:

[None, None, 20, None, 10]

被分类为:

[None, None, 10, None, 20]

和这个:

[None, 50, 20, None, None]

进入:

[None, 20, 50, None, None]

标签: pythonsortingnonetype

解决方案


您可以像这样获得稳定的排序:

  • 首先对不是 None 的值进行排序
  • 然后创建输出列表:
    • 如果原始列表项为无,则输出项为无
    • 如果它是一个数值,我们取排序列表中的下一个值

通过在其上创建一个迭代器,然后调用它,可以轻松地从排序列表中获取下一个值next


def stable_sort(lst):
    sorted_values = sorted([value for value in lst if value is not None])
    it_sorted = iter(sorted_values)
    out = []
    for value in lst:
        out.append(None if value is None else next(it_sorted))
    return out

print(stable_sort([None, None, 20, None, 10]))
# [None, None, 10, None, 20]

print(stable_sort([None, 50, 20, None, None]))
# [None, 20, 50, None, None]

推荐阅读