如何使用密钥获取列表的最小值/最大值

use*_*807 6 lisp common-lisp

我目前有一个对象列表,每个对象都包含一个特定的属性.我想用min属性值获取列表元素.这样做有简洁的方法吗?

python等价物将是这样的: min(d, key=d.get)

有没有办法获得最小/最大N个元素?

Rai*_*wig 10

CL-USER 8 > (reduce #'min '((1) (-1) (3)) :key #'first)
-1
Run Code Online (Sandbox Code Playgroud)

要么

CL-USER 9 > (loop for e in '((1) (-1) (3)) minimize (first e))
-1
Run Code Online (Sandbox Code Playgroud)

我担心容器元素更难:

CL-USER 9 > (defun minimum (list predicate key)
              (when list
                (let* ((m0 (first list))
                       (m1 (funcall key m0)))
                  (mapc (lambda (e0 &aux (e1 (funcall key e0)))
                          (when (funcall predicate e1 m1)
                            (psetf m0 e0 m1 e1)))
                        list)
                  m0)))
MINIMUM

CL-USER 10 > (minimum '((a 1) (b -1) (c -2)) #'< #'second)
(C -2)

CL-USER 11 > (minimum '((a 1) (b -1)) #'< #'second)
(B -1)

CL-USER 12 > (minimum '((a 1)) #'< #'second)
(A 1)

CL-USER 13 > (minimum '() #'< #'second)
NIL
Run Code Online (Sandbox Code Playgroud)

  • 这似乎在应用key指定的函数后返回元素,返回属性.有没有办法返回整个元素本身? (2认同)