Lisp 多列表上的计算函数

Lisp 多列表上的计算函数,lisp,common-lisp,Lisp,Common Lisp,我需要生成一个包含列表平均值的列表,其中子列表的数量可能会有所不同。因此,给定输入列表: ((l1a l1b l1c) (l2a l2b l2c) (l3a l3b l3c)...) 产出将是: (average(l1a l2a l3a) average(l1b l2b l3b) average(l1c l2c l3c)...). 我确信在lisp中有一种非常优雅的方法可以做到这一点,但我不知道从哪里开始。如果您有任何建议,我们将不胜感激。看起来您只需要映射。我不知道CL,但我知道Cloju

我需要生成一个包含列表平均值的列表,其中子列表的数量可能会有所不同。因此,给定输入列表:

((l1a l1b l1c) (l2a l2b l2c) (l3a l3b l3c)...)
产出将是:

(average(l1a l2a l3a) average(l1b l2b l3b) average(l1c l2c l3c)...).

我确信在lisp中有一种非常优雅的方法可以做到这一点,但我不知道从哪里开始。如果您有任何建议,我们将不胜感激。

看起来您只需要
映射
。我不知道CL,但我知道Clojure,这是另一种口齿不清的语言。如果您的列表绑定到符号
列表
,您只需在Clojure中执行
(映射平均列表)
。我相信它在CL中非常相似,就是这样!非常感谢。我知道会有一个简单的方法,但不知道地图的功能。例如,在CL中,使用add可以简单地使用:(map'list#'+'(1233)'(1233)'(1233))Np。如果您刚刚开始函数式编程,请确保您对
map
reduce
/
fold
有很好的理解(我不知道CL如何称呼它)。这些是你可能会经常使用的基本功能。Carcinegate是正确的。您需要定义一个以列表为参数的平均函数,然后将其传递给mapcar。该语法不同于Clojure-use(mapcar#'average list),其中average是您定义的函数。平均值函数应该使用reduce对列表求和。明白了-谢谢。是的,当我试图将我的解决方案应用于我的问题时,我意识到这是错误的。非常感谢你的解决方案,雷纳。
CL-USER 27 > (let* ((list-of-lists '((1.0 2.0 3.0)
                                     (1.0 3.0 5.0)
                                     (1.0 4.0 6.0)
                                     (1.0 5.0 8.0)))
                    (length (length list-of-lists)))
               (mapcar (lambda (x)
                         (/ x length))
                       (reduce (lambda (l1 l2)
                                 (mapcar #'+ l1 l2))
                               list-of-lists)))
(1.0 3.5 5.5)