如何拆分元组列表 Scala
How can I split a list of tuples scala
我在 Scala 中有这个列表(实际上长度为 500):
List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))
我该怎么做才能制作一个包含以下内容的新列表:
List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))
基本上我想要一个新的元组列表,它将包含旧元组的第一个元素和元组内列表的每个元素。我不确定如何开始实施这个,这就是为什么我没有发布任何代码来展示我的尝试。我真的很抱歉,但我无法理解这一点。感谢您提供的任何帮助。
scala> val xs = List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))
xs: List[(Int, List[Int])] = List((1,List(1, 2, 3)), (2,List(1, 2, 3)), (3,List(1, 2, 3)))
scala> xs.flatMap { case (x, ys) => ys.map(y => (x, y)) }
res0: List[(Int, Int)] = List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))
与@Andriy 完全相同,但使用 for comprehension。
这到底是 same 但恕我直言更具可读性。
val result = for {
(x, ys) <- xs
y <- ys
} yield (x, y) // You can also use x -> y
(再次,我建议您学习任何教程,这是一个基本练习,如果您了解 map
和 flatMap
的工作原理,您不应该任何问题)
可能值得一提的是,Andriy Plokhotnyuk 的解决方案也可以重写为 for-comprehension:
val list = List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))
val pairs = for {
(n, nestedList) <- list
m <- nestedList
} yield (n, m)
assert(pairs == List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)))
编译器将有效地将 for-comprehension 重写为 flatMap
/map
链,如另一个答案中所述。
我在 Scala 中有这个列表(实际上长度为 500):
List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))
我该怎么做才能制作一个包含以下内容的新列表:
List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))
基本上我想要一个新的元组列表,它将包含旧元组的第一个元素和元组内列表的每个元素。我不确定如何开始实施这个,这就是为什么我没有发布任何代码来展示我的尝试。我真的很抱歉,但我无法理解这一点。感谢您提供的任何帮助。
scala> val xs = List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))
xs: List[(Int, List[Int])] = List((1,List(1, 2, 3)), (2,List(1, 2, 3)), (3,List(1, 2, 3)))
scala> xs.flatMap { case (x, ys) => ys.map(y => (x, y)) }
res0: List[(Int, Int)] = List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))
与@Andriy 完全相同,但使用 for comprehension。 这到底是 same 但恕我直言更具可读性。
val result = for {
(x, ys) <- xs
y <- ys
} yield (x, y) // You can also use x -> y
(再次,我建议您学习任何教程,这是一个基本练习,如果您了解 map
和 flatMap
的工作原理,您不应该任何问题)
可能值得一提的是,Andriy Plokhotnyuk 的解决方案也可以重写为 for-comprehension:
val list = List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))
val pairs = for {
(n, nestedList) <- list
m <- nestedList
} yield (n, m)
assert(pairs == List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)))
编译器将有效地将 for-comprehension 重写为 flatMap
/map
链,如另一个答案中所述。