我如何使用键获取列表的 min/max
How would I get the min/max of a list using a key
我目前有一个对象列表,每个对象都包含某个属性。我想获取具有 min 属性值的列表元素。有没有简洁的方法来做到这一点?
python 等效项类似于:min(d, key=d.get)
有没有办法得到min/max N 个元素?
CL-USER 8 > (reduce #'min '((1) (-1) (3)) :key #'first)
-1
或
CL-USER 9 > (loop for e in '((1) (-1) (3)) minimize (first e))
-1
我担心获取容器元素比较困难:
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
使用Alexandria library: extremum提供的功能。
(extremum '((a 3) (b 1) (c 2)) #'< :key #'second)
=> (B 1)
我目前有一个对象列表,每个对象都包含某个属性。我想获取具有 min 属性值的列表元素。有没有简洁的方法来做到这一点?
python 等效项类似于:min(d, key=d.get)
有没有办法得到min/max N 个元素?
CL-USER 8 > (reduce #'min '((1) (-1) (3)) :key #'first)
-1
或
CL-USER 9 > (loop for e in '((1) (-1) (3)) minimize (first e))
-1
我担心获取容器元素比较困难:
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
使用Alexandria library: extremum提供的功能。
(extremum '((a 3) (b 1) (c 2)) #'< :key #'second)
=> (B 1)