Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将第一个列表中的每个元素添加到Scala中相应的列表中?_Scala_Nested Lists_For Comprehension_Scala Option - Fatal编程技术网

如何将第一个列表中的每个元素添加到Scala中相应的列表中?

如何将第一个列表中的每个元素添加到Scala中相应的列表中?,scala,nested-lists,for-comprehension,scala-option,Scala,Nested Lists,For Comprehension,Scala Option,因此,我有一份清单: var data = List( List(Some(313.062468), Some(27.847252), Some(29.847252)), List(Some(301.873641), Some(42.884065), Some(89.847252)), List(Some(332.373186), Some(53.509768), Some(10.847252)) ) 如何计算基本函数,如: 对于每个列表的每

因此,我有一份清单:

    var data = List(
      List(Some(313.062468), Some(27.847252), Some(29.847252)),
      List(Some(301.873641), Some(42.884065), Some(89.847252)),
      List(Some(332.373186), Some(53.509768), Some(10.847252))
    )
如何计算基本函数,如: 对于每个列表的每个元素:

第一排 第二列 第三纵队 我现在被困在这里 这仅打印每个嵌套列表的标题。我不知道如何获取嵌套元素的每个元素并进行上述计算

结果应该是这样的:

List(
  List(Some(-0.03573991820699504), Some(0.5399747522663995), Some(88.847252) )
  List(Some(0.10103414428290529), Some(0.24777742035415723), Some(9.847252) )
)

您可能希望从使用
transpose
方法开始,并从那里处理所需的逻辑。下面是对示例数据调用
transpose
的结果:

scala> data.transpose.foreach(println)
List(Some(313.062468), Some(301.873641), Some(332.373186))
List(Some(27.847252), Some(42.884065), Some(53.509768))
List(Some(29.847252), Some(89.847252), Some(10.847252))

转置、展平和压缩

val list = data.transpose.flatMap(_.flatten)
list.tail zip list map { case (a, b) => (b - a)/b }

scala> val list = data.transpose.flatMap(_.flatten)
list: List[Double] = List(313.062468, 301.873641, 332.373186, 27.847252, 42.884065, 53.509768, 29.847252, 89.847252, 10.847252)
Scala REPL

scala> list.tail zip list map { case (a, b) => (b - a)/b }
res19: List[Double] = List(0.03573991820699504, -0.10103414428290529, 0.9162169116734945, -0.5399747522663995, -0.24777742035415723, 0.4422092803691468, -2.010235314125401, 0.8792700749489812)
scala> var data = List(
     |       List(Some(313.062468), Some(27.847252), Some(29.847252)),
     |       List(Some(301.873641), Some(42.884065), Some(89.847252)),
     |       List(Some(332.373186), Some(53.509768), Some(10.847252))
     |     )
data: List[List[Some[Double]]] = List(List(Some(313.062468), Some(27.847252), Some(29.847252)), List(Some(301.873641), Some(42.884065), Some(89.847252)), List(Some(332.373186), Some(53.509768), Some(10.847252)))

scala> data.zip(data.tail)
res0: List[(List[Some[Double]], List[Some[Double]])] = List((List(Some(313.062468), Some(27.847252), Some(29.847252)),List(Some(301.873641), Some(42.884065), Some(89.847252))), (List(Some(301.873641), Some(42.884065), Some(89.847252)),List(Some(332.373186), Some(53.509768), Some(10.847252))))

scala> data.zip(data.tail).map { case (alist, blist) => alist zip blist }
res1: List[List[(Some[Double], Some[Double])]] = List(List((Some(313.062468),Some(301.873641)), (Some(27.847252),Some(42.884065)), (Some(29.847252),Some(89.847252))), List((Some(301.873641),Some(332.373186)), (Some(42.884065),Some(53.509768)), (Some(89.847252),Some(10.847252))))

scala> data.zip(data.tail).map { case (alist, blist) => alist zip blist }.flatten
res2: List[(Some[Double], Some[Double])] = List((Some(313.062468),Some(301.873641)), (Some(27.847252),Some(42.884065)), (Some(29.847252),Some(89.847252)), (Some(301.873641),Some(332.373186)), (Some(42.884065),Some(53.509768)), (Some(89.847252),Some(10.847252)))

scala> data.zip(data.tail).map { case (alist, blist) => alist zip blist }.flatten
res3: List[(Some[Double], Some[Double])] = List((Some(313.062468),Some(301.873641)), (Some(27.847252),Some(42.884065)), (Some(29.847252),Some(89.847252)), (Some(301.873641),Some(332.373186)), (Some(42.884065),Some(53.509768)), (Some(89.847252),Some(10.847252)))

scala> data.zip(data.tail).map { case (alist, blist) => alist.flatten zip blist.flatten }.flatten
res4: List[(Double, Double)] = List((313.062468,301.873641), (27.847252,42.884065), (29.847252,89.847252), (301.873641,332.373186), (42.884065,53.509768), (89.847252,10.847252))

scala> data.zip(data.tail).map { case (alist, blist) => alist.flatten zip blist.flatten }.flatten.map { case (a, b) => (b - a)/b}
res5: List[Double] = List(-0.037064604126863805, 0.35063870460974256, 0.6678000569232768, 0.09176295286347183, 0.19857501531309202, -7.282950557431505)
不是一个简洁的解决方案,但很有效

data.zip(data.tail).map { case (alist, blist) => alist.flatten zip blist.flatten }.flatten.map { case (a, b) => (b - a)/b}
重要的代码行

scala> data.zip(data.tail).map { case (alist, blist) => alist.flatten zip blist.flatten }.flatten
res4: List[(Double, Double)] = List((313.062468,301.873641), (27.847252,42.884065), (29.847252,89.847252), (301.873641,332.373186), (42.884065,53.509768), (89.847252,10.847252))

scala> data.zip(data.tail).map { case (alist, blist) => alist.flatten zip blist.flatten }.flatten.map { case (a, b) => (b - a)/b}
res5: List[Double] = List(-0.037064604126863805, 0.35063870460974256, 0.6678000569232768, 0.09176295286347183, 0.19857501531309202, -7.282950557431505)
Scala REPL

scala> list.tail zip list map { case (a, b) => (b - a)/b }
res19: List[Double] = List(0.03573991820699504, -0.10103414428290529, 0.9162169116734945, -0.5399747522663995, -0.24777742035415723, 0.4422092803691468, -2.010235314125401, 0.8792700749489812)
scala> var data = List(
     |       List(Some(313.062468), Some(27.847252), Some(29.847252)),
     |       List(Some(301.873641), Some(42.884065), Some(89.847252)),
     |       List(Some(332.373186), Some(53.509768), Some(10.847252))
     |     )
data: List[List[Some[Double]]] = List(List(Some(313.062468), Some(27.847252), Some(29.847252)), List(Some(301.873641), Some(42.884065), Some(89.847252)), List(Some(332.373186), Some(53.509768), Some(10.847252)))

scala> data.zip(data.tail)
res0: List[(List[Some[Double]], List[Some[Double]])] = List((List(Some(313.062468), Some(27.847252), Some(29.847252)),List(Some(301.873641), Some(42.884065), Some(89.847252))), (List(Some(301.873641), Some(42.884065), Some(89.847252)),List(Some(332.373186), Some(53.509768), Some(10.847252))))

scala> data.zip(data.tail).map { case (alist, blist) => alist zip blist }
res1: List[List[(Some[Double], Some[Double])]] = List(List((Some(313.062468),Some(301.873641)), (Some(27.847252),Some(42.884065)), (Some(29.847252),Some(89.847252))), List((Some(301.873641),Some(332.373186)), (Some(42.884065),Some(53.509768)), (Some(89.847252),Some(10.847252))))

scala> data.zip(data.tail).map { case (alist, blist) => alist zip blist }.flatten
res2: List[(Some[Double], Some[Double])] = List((Some(313.062468),Some(301.873641)), (Some(27.847252),Some(42.884065)), (Some(29.847252),Some(89.847252)), (Some(301.873641),Some(332.373186)), (Some(42.884065),Some(53.509768)), (Some(89.847252),Some(10.847252)))

scala> data.zip(data.tail).map { case (alist, blist) => alist zip blist }.flatten
res3: List[(Some[Double], Some[Double])] = List((Some(313.062468),Some(301.873641)), (Some(27.847252),Some(42.884065)), (Some(29.847252),Some(89.847252)), (Some(301.873641),Some(332.373186)), (Some(42.884065),Some(53.509768)), (Some(89.847252),Some(10.847252)))

scala> data.zip(data.tail).map { case (alist, blist) => alist.flatten zip blist.flatten }.flatten
res4: List[(Double, Double)] = List((313.062468,301.873641), (27.847252,42.884065), (29.847252,89.847252), (301.873641,332.373186), (42.884065,53.509768), (89.847252,10.847252))

scala> data.zip(data.tail).map { case (alist, blist) => alist.flatten zip blist.flatten }.flatten.map { case (a, b) => (b - a)/b}
res5: List[Double] = List(-0.037064604126863805, 0.35063870460974256, 0.6678000569232768, 0.09176295286347183, 0.19857501531309202, -7.282950557431505)

转换列表,然后使用
.slideing(2)
获得元素的滚动窗口:

scala> def diffPercent(o1: Option[Double], o2: Option[Double]) = (o1, o2) match {
         case (Some(d1), Some(d2)) => Some((d2 - d1) / d1)  // need to handle d1 == 0 too
         case _ => None
       }
diffPercent: (o1: Option[Double], o2: Option[Double])Option[Double]

// sample value before the final operation
scala> data.transpose.map(_.sliding(2).toList) // .toList to show the values in REPL
res13: List[List[List[Some[Double]]]] = List(List(List(Some(313.062468), Some(301.873641)), List(Some(301.873641), Some(332.373186))), ...)

scala> data.transpose.map(_.sliding(2).map {
         case o1 :: o2 :: Nil => diffPercent(o1, o2)
         case _ => None // source has less than 2 elems
       }.toList).transpose  // transpose back the list
res17: List[List[Option[Double]]] = List(List(Some(-0.03573991820699504), Some(0.5399747522663995), Some(2.010235314125401)), List(Some(0.10103414428290529), Some(0.24777742035415723), Some(-0.8792700749489812)))

这个比其他的简单一点,并且不使用
转置
。它非常接近@pamu。我从@Marth的答案中借用了
diffPercent

data.sliding(2)
    .map{case List(a, b) => (a zip b).map {case (x,y) => diffPercent(x,y)}}
    .toList

我明白了,那么我该如何在转置中获取每个列表的每个元素呢?但是当被展平时,列表将被合并,这是我不想要的。我要获取每个列表头的元素,然后获取每个列表中的下一个元素,依此类推。。就像柱子一样。我想从列透视图的角度来表示数据,例如,您可以执行类似于
data.transpose.map{案例列表(一些(a),一些(b),一些(c))=>/*您涉及列a、b和c的逻辑*/?}
这正是
transpose
所做的。直观地说,它将行转换为列,反之亦然。很抱歉删除了注释,我意识到这不是你想要的。我真的很喜欢你的实现方式,只是想知道,输出的顺序不正确,也许你知道为什么吗?@NaseebullahSafi:我的错,我忘了将列表调回原处。我编辑了我的回答谢谢Marth,真的很感谢你非常有价值的天赋。嘿,这里,输出的顺序似乎不对。有什么办法可以解决吗?这是你围绕这个问题提出的第三个非常基本的问题。您不应该使用SO作为编写代码的机器人。你有没有考虑过去学习一下Scala?有很多很好的教程可供选择。道歉@thearchetypaull不会再发生了。我是Scala的新手,非常感谢您的帮助。说真的,您自己解决这个问题会收获更多,当您真的陷入困境时,可以问一个具体的问题。道歉@thearchetypall谢谢。非常感谢。真的
scala> def diffPercent(o1: Option[Double], o2: Option[Double]) = (o1, o2) match {
         case (Some(d1), Some(d2)) => Some((d2 - d1) / d1)  // need to handle d1 == 0 too
         case _ => None
       }
diffPercent: (o1: Option[Double], o2: Option[Double])Option[Double]

// sample value before the final operation
scala> data.transpose.map(_.sliding(2).toList) // .toList to show the values in REPL
res13: List[List[List[Some[Double]]]] = List(List(List(Some(313.062468), Some(301.873641)), List(Some(301.873641), Some(332.373186))), ...)

scala> data.transpose.map(_.sliding(2).map {
         case o1 :: o2 :: Nil => diffPercent(o1, o2)
         case _ => None // source has less than 2 elems
       }.toList).transpose  // transpose back the list
res17: List[List[Option[Double]]] = List(List(Some(-0.03573991820699504), Some(0.5399747522663995), Some(2.010235314125401)), List(Some(0.10103414428290529), Some(0.24777742035415723), Some(-0.8792700749489812)))
data.sliding(2)
    .map{case List(a, b) => (a zip b).map {case (x,y) => diffPercent(x,y)}}
    .toList