2011-12-22 38 views
18

我有两个列表,我想将列表A中的每个元素与列表B中的元素相加,产生一个新列表。在Scala中总结两个列表的最简单方法是什么?

List(1,2).zip(List(5,5)).map(t => t._1 + t._2) 

有没有更简单的或更合适的方法在Scala中做到这一点:

我能做到这一点?

在Clojure中我可以这样做:

(map + [1 2 3] [4 5 6]) 
+1

Lisp-y'map'通常可以处理任意数量输入的函数。另一方面,Scala,Haskell和朋友只为需要1个输入的函数定义'map'。因此,在Scala中,您将始终需要执行某种形式的压缩以将多个输入填充到单个元组中。 – 2011-12-22 17:47:09

+0

Lisp在某些方面看起来不错。 – Phil 2011-12-24 13:41:46

+0

另请注意,lisp中的map与我在Haskell中调用'zipWith','zipWith3'等类似。 – 2011-12-24 15:29:04

回答

38

对于两个列表:

(List(1,2), List(5,5)).zipped.map(_ + _) 

对于三个列表:

(List(1,2), List(5,5), List(9, 4)).zipped.map(_ + _ + _) 

对于n列表:

List(List(1, 2), List(5, 5), List(9, 4), List(6, 3)).transpose.map(_.sum) 
9

missingfaktor的答案也是我会推荐的。

但是,你甚至可以改善你的片断摆脱使用笨拙_1,_2:

List(1,2) zip List(5,5) map { case (a, b) => a + b } 
3

另一种方式来简化:

import Function.tupled 
List(1,2).zip(List(5,5)) map tupled {_ + _} 
0

在Scalaz:

List(1,2) merge List(5,5) 

适用于不同尺寸的列表:List(1,2,3) merge List(5,5)将返回List(6,7,3)

相关问题