如何获取scala中选项列表列表的当前和下一个元素
How to get the current and next element of List of list of options in scala
这个问题可能会重复,但是,我没有遇到任何问题可以回答我的问题。
所以我有一个List[ List[ Option[ Double ] ] ]
具有以下数据:
var tests = List(
List(Some(313.062468), Some(27.847252)),
List(Some(301.873641), Some(42.884065)),
List(Some(332.373186), Some(53.509768))
)
我想计算这个等式:
def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = {
return Some(( newPrice.get - oldPrice.get ) / oldPrice.get)
}
关于以下内容:
正在对两个列表的元素进行计算:
(Some(301.062468) - Some(313.062468)) / Some(313.062468)
(Some(332.373186) - Some(301.873641)) / Some(301.873641)
(Some(42.884065) - Some(27.847252)) / Some(27.847252)
(Some(53.509768) - Some(42.884065)) / Some(42.884065)
结果应该return:
#
List(
List(Some(-0.03573991820699504), Some(0.5399747522663995))
List(Some(0.10103414428290529), Some(0.24777742035415723))
)
到目前为止我的代码
def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = {
return Some(( newPrice.get - oldPrice.get ) / oldPrice.get)
}
def get_deltas(data: List[List[Option[Double]]]): List[List[Option[Double]]] = {
for {
i <- data
// So this is where I am stuck. I have the current element i, but I need the same index element in the next list
} ( findDifference(i,?) }
我的输出如果我在 For-comprehension 中打印我的 I
List(Some(313.062468), Some(27.847252))
List(Some(301.873641), Some(42.884065))
List(Some(332.373186), Some(53.509768))
我卡在哪里了?
我不知道如何从List 2和List 3中获取list 1中相同索引的元素并进行必要的计算?
请帮我实现我的结果输出
尝试玩这个:
object OptIdx {
def main(args: Array[String]) {
println(get_deltas(tests))
}
var tests = List(
List(Some(313.062468), Some(27.847252)),
List(Some(301.873641), Some(42.884065)),
List(Some(332.373186), Some(53.509768)))
def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = {
Some((newPrice.get - oldPrice.get) / oldPrice.get)
}
def get_deltas(data: List[List[Option[Double]]]): List[List[Option[Double]]] = {
(for {
index <- 0 to 1
} yield {
(for {
i <- 0 to data.length - 2
} yield {
findDifference(data(i)(index), data(i + 1)(index))
}).toList
}).toList
}
}
它打印了你想要的数字,但其中两个被交换了。不过,我相信你能弄明白。
所以你的数据结构意味着 i
是两个选项的列表。您需要的值已经存在,因此您可以调用 i(0)
和 i(1)
我在 repl 中做了一个快速而肮脏的:
scala> val tests = List(
| List(Some(313.062468), Some(27.847252)),
| List(Some(301.873641), Some(42.884065)),
| List(Some(332.373186), Some(53.509768))
| )
tests: List[List[Some[Double]]] = List(List(Some(313.062468), Some(27.847252)), List(Some(301.873641), Some(42.884065)), List(Some(332.373186), Some(53.509768)))
这里你可以看到我调用时 i 的值:
scala> for { i <- tests } println(i)
List(Some(313.062468), Some(27.847252))
List(Some(301.873641), Some(42.884065))
List(Some(332.373186), Some(53.509768))
所以你可以这样调用findDifference
:
scala> def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = {
| Option((oldPrice.get - newPrice.get) /oldPrice.get)
| }
findDifference: (oldPrice: Option[Double], newPrice: Option[Double])Option[Double]
scala> for { i <- tests } println(findDifference(i(0), i(1)))
Some(0.911048896477747)
Some(0.8579403459740957)
Some(0.8390069648999904)
这个问题可能会重复,但是,我没有遇到任何问题可以回答我的问题。
所以我有一个List[ List[ Option[ Double ] ] ]
具有以下数据:
var tests = List(
List(Some(313.062468), Some(27.847252)),
List(Some(301.873641), Some(42.884065)),
List(Some(332.373186), Some(53.509768))
)
我想计算这个等式:
def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = {
return Some(( newPrice.get - oldPrice.get ) / oldPrice.get)
}
关于以下内容:
正在对两个列表的元素进行计算:
(Some(301.062468) - Some(313.062468)) / Some(313.062468)
(Some(332.373186) - Some(301.873641)) / Some(301.873641)
(Some(42.884065) - Some(27.847252)) / Some(27.847252)
(Some(53.509768) - Some(42.884065)) / Some(42.884065)
结果应该return: #
List(
List(Some(-0.03573991820699504), Some(0.5399747522663995))
List(Some(0.10103414428290529), Some(0.24777742035415723))
)
到目前为止我的代码
def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = {
return Some(( newPrice.get - oldPrice.get ) / oldPrice.get)
}
def get_deltas(data: List[List[Option[Double]]]): List[List[Option[Double]]] = {
for {
i <- data
// So this is where I am stuck. I have the current element i, but I need the same index element in the next list
} ( findDifference(i,?) }
我的输出如果我在 For-comprehension 中打印我的 I
List(Some(313.062468), Some(27.847252))
List(Some(301.873641), Some(42.884065))
List(Some(332.373186), Some(53.509768))
我卡在哪里了?
我不知道如何从List 2和List 3中获取list 1中相同索引的元素并进行必要的计算?
请帮我实现我的结果输出
尝试玩这个:
object OptIdx {
def main(args: Array[String]) {
println(get_deltas(tests))
}
var tests = List(
List(Some(313.062468), Some(27.847252)),
List(Some(301.873641), Some(42.884065)),
List(Some(332.373186), Some(53.509768)))
def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = {
Some((newPrice.get - oldPrice.get) / oldPrice.get)
}
def get_deltas(data: List[List[Option[Double]]]): List[List[Option[Double]]] = {
(for {
index <- 0 to 1
} yield {
(for {
i <- 0 to data.length - 2
} yield {
findDifference(data(i)(index), data(i + 1)(index))
}).toList
}).toList
}
}
它打印了你想要的数字,但其中两个被交换了。不过,我相信你能弄明白。
所以你的数据结构意味着 i
是两个选项的列表。您需要的值已经存在,因此您可以调用 i(0)
和 i(1)
我在 repl 中做了一个快速而肮脏的:
scala> val tests = List(
| List(Some(313.062468), Some(27.847252)),
| List(Some(301.873641), Some(42.884065)),
| List(Some(332.373186), Some(53.509768))
| )
tests: List[List[Some[Double]]] = List(List(Some(313.062468), Some(27.847252)), List(Some(301.873641), Some(42.884065)), List(Some(332.373186), Some(53.509768)))
这里你可以看到我调用时 i 的值:
scala> for { i <- tests } println(i)
List(Some(313.062468), Some(27.847252))
List(Some(301.873641), Some(42.884065))
List(Some(332.373186), Some(53.509768))
所以你可以这样调用findDifference
:
scala> def findDifference(oldPrice: Option[Double], newPrice: Option[Double]): Option[Double] = {
| Option((oldPrice.get - newPrice.get) /oldPrice.get)
| }
findDifference: (oldPrice: Option[Double], newPrice: Option[Double])Option[Double]
scala> for { i <- tests } println(findDifference(i(0), i(1)))
Some(0.911048896477747)
Some(0.8579403459740957)
Some(0.8390069648999904)