【问题标题】:Apply function on each elements in one list using element from others list as argument?使用其他列表中的元素作为参数对一个列表中的每个元素应用函数?
【发布时间】:2011-11-30 06:53:22
【问题描述】:

我不知道怎么称呼它,但我想要这样的东西。

val x = List(1,2,3,...)
val y = List(4,5,6,...)
//want a result of List(1+4, 5+6, 7+8,...)

在 scala 中是否有一种简单的方法可以做到这一点?我当前的实现涉及使用从 0 到 x.lenght 的循环,这非常难看。如果可能的话,我想要一个可以使用超过 n 个列表的解决方案,并且可能与 + 旁边的其他类型的运算符一起使用。

谢谢!

【问题讨论】:

  • 是的,它是重复的。 zipWith 仍然不在 Scala 中,Martin 的答案仍然有效——而且很简单。
  • 谢谢,但如果我有超过 3 个列表怎么办?似乎这些解决方案仅限于元组,这几乎只能超过三个列表。
  • (List(1,2,3), List(4,5,6), List(7,8,9)).zipped map (_ + _ + _) // 生成 List (12、15、18)(编辑:哎呀,我在那里读到了“2 个列表”。你说得对,这不会扩展到第四个列表。)
  • 5+6、7+8 还是 2+5、3+6...?

标签: scala


【解决方案1】:

针对“如果我有超过 3 个列表怎么办?”:

def combineAll[T](xss: Seq[T]*)(f: (T, T) => T) = 
  xss reduceLeft ((_,_).zipped map f)

这样使用:

scala> combineAll(List(1,2,3), List(2,2,2), List(4,5,6), List(10,10,10))(_+_)
res5: Seq[Int] = List(17, 19, 21)

编辑:或者

def combineAll[T](xss: Seq[T]*)(f: (T, T) => T) = 
  xss.transpose map (_ reduceLeft f)

做同样的事情并且可能更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2020-02-22
    • 2016-12-13
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多