如何从列表列表中检索每个"column"中的最小值列表?



我有这个小函数,它返回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))

coredump的答案很好,如果您真的想使用循环,但这里没有必要。mapcar可以接受多个列表参数,而min接受一个或多个参数,因此您可以对列表进行mapcarmin操作。

(let ((xs '(8 4 1))
      (ys '(3 9 2))
      (zs '(9 2 4)))
  (mapcar 'min xs ys zs))
;=> (3 2 1)

如果你已经在使用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)

相关内容

最新更新