如何拆分元组列表 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

(再次,我建议您学习任何教程,这是一个基本练习,如果您了解 mapflatMap 的工作原理,您不应该任何问题)

可能值得一提的是,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 链,如另一个答案中所述。