我有两个列表,我想将列表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])
我有两个列表,我想将列表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])
对于两个列表:
(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)
missingfaktor的答案也是我会推荐的。
但是,你甚至可以改善你的片断摆脱使用笨拙_1,_2:
List(1,2) zip List(5,5) map { case (a, b) => a + b }
另一种方式来简化:
import Function.tupled
List(1,2).zip(List(5,5)) map tupled {_ + _}
在Scalaz:
List(1,2) merge List(5,5)
适用于不同尺寸的列表:List(1,2,3) merge List(5,5)
将返回List(6,7,3)
Lisp-y'map'通常可以处理任意数量输入的函数。另一方面,Scala,Haskell和朋友只为需要1个输入的函数定义'map'。因此,在Scala中,您将始终需要执行某种形式的压缩以将多个输入填充到单个元组中。 – 2011-12-22 17:47:09
Lisp在某些方面看起来不错。 – Phil 2011-12-24 13:41:46
另请注意,lisp中的map与我在Haskell中调用'zipWith','zipWith3'等类似。 – 2011-12-24 15:29:04