Сортировка Python нет игнорировать (или стабильный) - PullRequest
0 голосов
/ 27 августа 2018

У меня есть списки, чьи элементы либо числа, либо None.

Я хочу отсортировать их, чтобы элементы None оставались на одном месте, а числовые значения сортировались.

Например, мне нужен этот список:

[None, None, 20, None, 10]

для сортировки по:

[None, None, 10, None, 20]

и по этому:

[None, 50, 20, None, None]

на:

[None, 20, 50, None, None]

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете получить свою стабильную сортировку следующим образом:

  • сначала отсортируйте значения, которые не являются 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]
...