如何从列表列表中检索每个 "column" 中的最小值列表?
How to retrieve list of minimum values in each "column" from a list of lists?
所以我有这个小函数 returns 一组 3 个列表中的最小值,有没有办法让我把它写得更好看?它对我来说似乎不是很 Lispy,但话又说回来我可能不知道那是什么意思(我是一个 lisp 菜鸟)
任何提示将不胜感激。
;;;;minimum of 3
(defun minimum-of-3 (list1 list2 list3);returns the minimum value when comparing 3 lists
(setq minimum-list '())
(setq mini '())
(loop for x in list1
for y in list2
for z in list3
do
(push x mini)
(push y mini)
(push z mini)
(push (apply 'min mini) minimum-list)
(setq mini '()))
(reverse minimum-list))
如果您已经在使用 loop
,您在这里不需要任何其他内容,请阅读有关 loop
它真的很强大
(defun minimum-of-3 (list-1 list-2 list-3)
(loop :for x :in list-1
:and y :in list-2
:and z :in list-3
:collect (min x y z)))
CL-USER> (minimum-of-3 '(1 2 3) '(4 5 6) '(7 8 -1))
(1 2 -1)
CL-USER> (minimum-of-3 '(1 2 3) '(4 -5 6) '(7 8 -1))
(1 -5 -1)
CL-USER> (minimum-of-3 '(1 2 3) '(4 -5 6) '(7 8))
(1 -5)
coredump 的答案很好,如果你真的想使用 loop,但这里没有必要。 mapcar 可以接受多个列表参数,而 min 接受一个或多个参数,所以你可以只 mapcar min 个列表。
(let ((xs '(8 4 1))
(ys '(3 9 2))
(zs '(9 2 4)))
(mapcar 'min xs ys zs))
;=> (3 2 1)
所以我有这个小函数 returns 一组 3 个列表中的最小值,有没有办法让我把它写得更好看?它对我来说似乎不是很 Lispy,但话又说回来我可能不知道那是什么意思(我是一个 lisp 菜鸟) 任何提示将不胜感激。
;;;;minimum of 3
(defun minimum-of-3 (list1 list2 list3);returns the minimum value when comparing 3 lists
(setq minimum-list '())
(setq mini '())
(loop for x in list1
for y in list2
for z in list3
do
(push x mini)
(push y mini)
(push z mini)
(push (apply 'min mini) minimum-list)
(setq mini '()))
(reverse minimum-list))
如果您已经在使用 loop
,您在这里不需要任何其他内容,请阅读有关 loop
它真的很强大
(defun minimum-of-3 (list-1 list-2 list-3)
(loop :for x :in list-1
:and y :in list-2
:and z :in list-3
:collect (min x y z)))
CL-USER> (minimum-of-3 '(1 2 3) '(4 5 6) '(7 8 -1))
(1 2 -1)
CL-USER> (minimum-of-3 '(1 2 3) '(4 -5 6) '(7 8 -1))
(1 -5 -1)
CL-USER> (minimum-of-3 '(1 2 3) '(4 -5 6) '(7 8))
(1 -5)
coredump 的答案很好,如果你真的想使用 loop,但这里没有必要。 mapcar 可以接受多个列表参数,而 min 接受一个或多个参数,所以你可以只 mapcar min 个列表。
(let ((xs '(8 4 1))
(ys '(3 9 2))
(zs '(9 2 4)))
(mapcar 'min xs ys zs))
;=> (3 2 1)