Алгоритм сортировки в OpenOffice calc - PullRequest
2 голосов
/ 23 сентября 2011

У меня действительно длинный день, кульминацией которого является тупой момент, когда я пытаюсь отсортировать список строк. Calc сортирует их так:

0DCv6UlY6T0
0ITZEBZrwMk
1062VEX2EfI
2jk7hilGMs0
2lZVu3haI6A
3f8s3KbFQ0Q
3hB09daYLmk
43Erj3qFxxo
6lj33w3YoOw
7jiNQnkfx0k
7TSMj6g3UoE
7Wba8IUk6v8
9hbG9dS7zl0
ALThJiGFBSc
by_VzOiPhZM
Ce250P1xep0
Cgx6DV6RJg8
d5dDgLRd1-o
DnyzZwaYDXE
dO5KLh2er4E

Это не совсем то, что я ожидал. Посмотрите на последние 3 значения. Разве запись, начинающаяся с заглавной буквы D, не должна предшествовать записи, начинающейся с строчной буквы d (или наоборот)? Почему это между строчными d записями?

Как ни странно, командная строка sort в Linux делает то же самое. Может кто-нибудь объяснить логику такой сортировки? Мне нужно скопировать его (или воспроизвести на Python, если он где-то уже реализован).

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

Это из-за локали. Смотрите разницу между:

sort inputfile

и с (что вы, вероятно, хотите):

LANG="C" sort inputfile

вывод второй команды:

0DCv6UlY6T0
0ITZEBZrwMk
1062VEX2EfI
2jk7hilGMs0
2lZVu3haI6A
3f8s3KbFQ0Q
3hB09daYLmk
43Erj3qFxxo
6lj33w3YoOw
7TSMj6g3UoE
7Wba8IUk6v8
7jiNQnkfx0k
9hbG9dS7zl0
ALThJiGFBSc
Ce250P1xep0
Cgx6DV6RJg8
DnyzZwaYDXE
by_VzOiPhZM
d5dDgLRd1-o
dO5KLh2er4E
2 голосов
/ 23 сентября 2011

То, являются ли заглавные буквы лексикографически отличными от букв нижнего регистра, зависит от локали (в частности, LC_COLLATE), которая объясняет программу сортировки командной строки (и ls и ...), и предположительно также Openoffice.


$ cat test 
Abc
aabc
$ sort test 
aabc
Abc
$ LC_COLLATE=C sort test 
Abc
aabc
1 голос
/ 23 сентября 2011

Для репликации:

   data = [  "abc", "aBB", "abD", "Aac", "AAb", "ABc", "ABa" ]
   print sorted(data, key = lambda item: item.upper())

Хитрость заключается в предоставлении аргумента key.Эта функция применяется к элементам списка, а результат используется для сравнений во время сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...