Python中itertools.starmap的Common Lisp等价物是什么?

7

Python的Itertools有一个被称为starmap的函数。给定一个集合的集合和一个函数,它将严格应用该函数于集合中的每个集合,并使用该内部集合的元素作为函数的参数。例如:

from itertools import starmap
 
NestedList = [(1, 2), (3, 4), (5, 6), (0, 0), (1, 1), (2, 2)]

list(starmap(lambda x, y:x + y, NestedList))

返回包含3、7、11、0、2和4的列表。

我拒绝相信Python是第一个提出这个概念的语言,但当我尝试想起早期语言中它被称为什么时,我却一筹莫展。常见的Lisp语言中是否存在类似的功能?我确信有,但我无法给它命名。

3个回答

7
使用mapcarapply的组合:
(defun starmap (f list)
  (mapcar (lambda (x) (apply f x)) list))

或者使用关键字 collect loop
(defun starmap (f list)
  (loop for x in list 
        collect (apply f x)))

例子:

> (starmap (lambda (x y) (+ x y)) '((1 2) (3 4) (5 6) (0 0) (1 1) (2 2)))
(3 7 11 0 2 4)

> (starmap #'expt '((1 2) (3 4) (5 6) (0 0) (1 1) (2 2)))
(1 81 15625 1 1 4)

6
我不相信Python是第一个提出这个概念的,但是当我试图想起早期语言中它被称为什么时,我却一筹莫展。我确信它有这个功能,但我无法给它命名。
针对这一点,考虑到Lispers或更普遍的函数式编程人员会说:“map the apply function”,因此自然的名称应该是mapply
通过寻找这个名称,你可以看到确实有像Serapeum这样定义它的库,但也有早期对这个函数(具有相同含义)的引用,比如1992年(H. Baker:Look'Lively Linear Lisp — 'Look Ma, No Garbage!'),甚至可能更早。
Python使用*来扩展值列表的方式与apply相同,这就解释了为什么它被命名为starmap

直接链接:https://github.com/ruricolist/serapeum/blob/master/REFERENCE.md#mapply-fn-list-rest-lists - Ehvince
@Ehvince 谢谢,确实是更好的链接。 - coredump
R的mapply基本上就是map。事实上,R的Map只是mapply的一个包装器。 - J. Mini
@J.Mini 感谢,我觉得最好还是从答案中删除这部分内容。 - coredump

3
在Common Lisp中,可以通过结合使用mapcarapply来实现这一目标。
(mapcar (lambda (lst) (apply (lambda (a b) (+ a b)) lst))
    '((1 2) (3 4)))

同样地,我们也可以在JavaScript中实现它:
[[1, 2], [3, 4]].map(([x, y]) => x + y);

所以,starmap并没有什么新鲜的东西,只是一个便捷的快捷方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接