После расспросов мне дали удовлетворительное объяснение:
Краткий ответ: Вы хотите, чтобы SortBy[list, {f}]
получил стабильную сортировку.
Длинный ответ:
SortBy[list, f]
сортирует список в порядке, определенном путем применения f к каждому элементу списка, разрыв связи с использованием канонического порядка, описанного в разделе Сортировка . (Это вторая документированная заметка «Дополнительная информация» в документации для SortBy .)
SortBy[list, {f, g}]
разрывает связи, используя порядок, определенный путем применения g к каждому элементу.
Обратите внимание, что SortBy[list, f]
совпадает с SortBy[list, {f, Identity}]
.
SortBy[list, {f}]
не прерывает связь (и дает стабильную сортировку), что вам нужно:
In[13]:= SortBy[{19, 301, 201, 502, 501, 101, 300}, {Mod[#, 10] &}]
Out[13]= {300, 301, 201, 501, 101, 502, 19}
Наконец, решение Сакры SortBy[list, {f, tie++ &}]
фактически эквивалентно SortBy[list, {f}]
.