Как отсортировать список с помощью подсписков (обычный Lisp) - PullRequest
5 голосов
/ 14 мая 2011

Как отсортировать список с подсписками?

(setq list '((0) (1) (2) (0 1 5) (0 1 3) (0 1 5) (0 3 0) (0) (1) 
             (2 7 19) (0 0 3 0)))

; restricting the sort to only the first element:

(sort (copy-seq list) #'< :key #'car)

--> ((0) (0 1 5) (0 1 3) (0 1 5) (0 3 0) (0) (0 0 3 0) (1) (1) (2) (2 7 19))

Требуемый вывод сортируется по всем элементам подсписка:

--> ((0) (0) (0 0 3 0) (0 1 3) (0 1 5) (0 1 5) (0 3 0) (1) (1) (2) (2 7 19))

Ответы [ 2 ]

12 голосов
/ 14 мая 2011

Начните с определения функции, которая определяет, будет ли один список меньше другого. В следующем примере предполагается, что списки могут содержать только цифры:

(defun list< (a b)
  (cond ((null a) (not (null b)))
        ((null b) nil)
        ((= (first a) (first b)) (list< (rest a) (rest b)))
        (t (< (first a) (first b))) ))

Вооружившись этой функцией, вы теперь можете сортировать список списков.

(sort (copy-seq list) #'list<)
0 голосов
/ 14 мая 2011

Чтобы отсортировать по всем элементам подсписка, используйте пользовательскую функцию для сортировки предикат или key . Изменение предиката сортировки к пользовательской функции, которая может определять порядок двух подсписков.В качестве альтернативы, измените ключ сортировки на пользовательскую функцию, которая сокращает подсписок до сортируемого значения.

...