lsort
-
ИМЯ
- lsort — Сортировка элементов списка
- СИНТАКСИС
- ОПИСАНИЕ
-
-ascii
- -dictionary
- -integer
- -real
- -command command
- -increasing
- -decreasing
- -indices
- -index indexList
- -stride strideLength
- -nocase
- -unique
- -dictionary
Имя
lsort — Сортировка элементов спискаСинтаксис
lsort ?options? listОписание
Эта команда сортирует элементы list, возвращая новый список в отсортированном порядке. Реализация команды lsort использует алгоритм слияния, который является стабильной сортировкой с характеристиками производительности O(n log n).По умолчанию используется сортировка ASCII с результатом, возвращаемым в возрастающем порядке. Однако перед list можно указать любой из следующих параметров для управления процессом сортировки (допускаются уникальные сокращения):
- -ascii
- Используйте сравнение строк с порядком сортировки кодов Unicode (название сохранено для обратной совместимости.) Это значение по умолчанию.
- -dictionary
- Используйте сравнение в стиле словаря. Это то же самое, что -ascii, за исключением (a) регистр игнорируется, за исключением случая ничьей, и (b) если две строки содержат встроенные числа, числа сравниваются как целые, а не символы. Например, в режиме -dictionary, bigBoy сортируется между bigbang и bigboy, а x10y сортируется между x9y и x11y.
- -integer
- Преобразуйте элементы списка в целые числа и используйте сравнение целых чисел.
- -real
- Преобразуйте элементы списка в значения с плавающей точкой и используйте сравнение с плавающей точкой.
- -command command
- Используйте command в качестве команды сравнения. Для сравнения двух элементов вычислите Tcl-скрипт, состоящий из command с двумя элементами, добавленными в качестве дополнительных аргументов. Скрипт должен возвращать целое число меньше, равно или больше нуля, если первый элемент должен рассматриваться как меньше, равно или больше второго соответственно.
- -increasing
- Сортирует список в порядке возрастания («наименьшие» элементы вначале). Это значение по умолчанию.
- -decreasing
- Сортирует список в порядке убывания («наибольшие» элементы вначале).
- -indices
- Возвращает список индексов в list в отсортированном порядке вместо самих значений.
- -index indexList
- Если этот параметр указан, каждый из элементов list должен быть правильным Tcl-подсписком (если не используется -stride). Вместо сортировки на основе целых подсписков, lsort извлечёт indexList-ый элемент из каждого подсписка (как если бы общий элемент и indexList были переданы в lindex) и отсортирует на основе заданного элемента. Например,
lsort -integer -index 1 \ {{First 24} {Second 18} {Third 30}}вернёт {Second 18} {First 24} {Third 30},
lsort -index end-1 \ {{a 1 e i} {b 2 3 f g} {c 4 5 6 d h}}вернёт {c 4 5 6 d h} {a 1 e i} {b 2 3 f g}, и
lsort -index {0 1} { {{b i g} 12345} {{d e m o} 34512} {{c o d e} 54321} }вернёт {{d e m o} 34512} {{b i g} 12345} {{c o d e} 54321} (потому что e сортируется перед i, а i — перед o). Этот параметр намного эффективнее, чем использование -command для достижения того же эффекта.
- -stride strideLength
- Если этот параметр указан, список обрабатывается как состоящий из групп по strideLength элементов, и группы сортируются по их первому элементу или, если используется параметр -index, по элементу внутри каждой группы, заданному первым индексом, переданным в -index (который затем игнорируется -index). Элементы всегда остаются на тех же позициях внутри своей группы.
Длина списка должна быть целым кратным strideLength, который, в свою очередь, должен быть не менее 2.
Например,
lsort -stride 2 {carrot 10 apple 50 banana 25}вернёт “яблоко 50 банан 25 морковь 10”, и
lsort -stride 2 -index 1 -integer {carrot 10 apple 50 banana 25}вернёт “морковь 10 банан 25 яблоко 50”.
- -nocase
- Принуждает сравнения к обработке в регистронезависимом режиме. Не оказывает никакого влияния, если комбинируется с параметрами -dictionary, -integer или -real.
- -unique
- Если этот параметр указан, то будет сохранён только последний набор дублируемых элементов, найденных в списке. Обратите внимание, что дубликаты определяются относительно сравнения, используемого в сортировке. Таким образом, если используется -index 0, {1 a} и {1 b} будут считаться дубликатами, и будет сохранён только второй элемент, {1 b}.
Примечания
Параметры lsort управляют только тем, какой тип сравнения используется, и не обязательно ограничивают то, каковы сами значения. Это различие заметно только тогда, когда сортируемый список содержит менее двух элементов.Команда lsort является рекурсивной, то есть её безопасно использовать как часть реализации команды, используемой в параметре -command.
Примеры
Сортировка списка с использованием сортировки ASCII:% lsort {a10 B2 b1 a1 a2}
B2 a1 a10 a2 b1 Сортировка списка с использованием сортировки словаря:
% lsort -dictionary {a10 B2 b1 a1 a2}
a1 a2 a10 b1 B2 Сортировка списков целых чисел:
% lsort -integer {5 3 1 2 11 4}
1 2 3 4 5 11
% lsort -integer {1 2 0x5 7 0 4 -1}
-1 0 1 2 4 0x5 7 Сортировка списков чисел с плавающей точкой:
% lsort -real {5 3 1 2 11 4}
1 2 3 4 5 11
% lsort -real {.5 0.07e1 0.4 6e-1}
0.4 .5 6e-1 0.07e1 Сортировка с использованием индексов:
% # Note the space character before the c
% lsort {{a 5} { c 3} {b 4} {e 1} {d 2}}
{ c 3} {a 5} {b 4} {d 2} {e 1}
% lsort -index 0 {{a 5} { c 3} {b 4} {e 1} {d 2}}
{a 5} {b 4} { c 3} {d 2} {e 1}
% lsort -index 1 {{a 5} { c 3} {b 4} {e 1} {d 2}}
{e 1} {d 2} { c 3} {b 4} {a 5} Сортировка словаря:
% set d [dict create c d a b h i f g c e] c e a b h i f g % lsort -stride 2 $d a b c e f g h i
Сортировка с использованием шага и множественных индексов:
% # Note the first index value is relative to the group
% lsort -stride 3 -index {0 1} \
{{Bob Smith} 25 Audi {Jane Doe} 40 Ford}
{{Jane Doe} 40 Ford {Bob Smith} 25 Audi} Удаление дублирующих значений с помощью сортировки:
% lsort -unique {a b c a b c a b c}
a b c Более сложная сортировка с использованием функции сравнения:
% proc compare {a b} {
set a0 [lindex $a 0]
set b0 [lindex $b 0]
if {$a0 < $b0} {
return -1
} elseif {$a0 > $b0} {
return 1
}
return [string compare [lindex $a 1] [lindex $b 1]]
}
% lsort -command compare \
{{3 apple} {0x2 carrot} {1 dingo} {2 banana}}
{1 dingo} {2 banana} {0x2 carrot} {3 apple} См. также
list, lappend, lindex, linsert, llength, lsearch, lset, lrange, lreplace
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/lsort.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/lsort.htm