Scala - 将列表的列表转换为单个列表:List[List[A]] 转换为 List[A]

42

如何在scala(2.9)中转换一个列表的列表?

我有一个列表:

List[List[A]]
我想要将其转换为什么。
List[A]

怎么可以使用递归实现?或者有更好的方式吗?

6个回答

60

List 有flatten方法,为什么不使用它?

List(List(1,2), List(3,4)).flatten
> List(1,2,3,4)

2
你会如何将以下列表压平?List(1, List(2,3), 4, List(5,6,7))期望的结果是List(1, 2, 3, 4, 5, 6, 7) - andres.santana
3
上述列表是异构的,无法使用扁平化函数。你可以尝试以下方法:List(1, List(2,3), 4, List(5,6,7)).collect{case i:Int => List(i); case l @ a :: b => l}.flatten。 - Jan

13

.flatten 显然是最简单的方法,但为了完整性,您也应该了解 flatMap

 val l = List(List(1, 2), List(3, 4))
 println(l.flatMap(identity))

以及for循环的等效表达式

 println(for (list <- l; x <- list) yield x)

flatten显然是flatMap的一个特例,而flatMap可以做更多的事情。


如果您想在映射过程中添加一些数据,这就是您想要的。 - Andy Hayden
有趣的是,IDEA建议我将listOfLists.flatMap(identity)更改为listOfLists.flatten - F. P. Freely

10

根据上面的例子,我不确定您是否需要递归。看起来您想使用 List.flatten

例如:

scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)

scala> List(4,5,6)
res1: List[Int] = List(4, 5, 6)

scala> List(res0,res1)
res2: List[List[Int]] = List(List(1, 2, 3), List(4, 5, 6)) 

scala> res2.flatten
res3: List[Int] = List(1, 2, 3, 4, 5, 6)

7
如果您的结构可以进一步嵌套,例如:
List(List(1, 2, 3, 4, List(5, 6, List(7, 8))))

这个函数应该能够给你想要的结果:
def f[U](l: List[U]): List[U] = l match {
  case Nil => Nil
  case (x: List[U]) :: tail => f(x) ::: f(tail)
  case x :: tail => x :: f(tail)
}

0

你不需要使用递归,但如果你想用的话可以使用它:

def flatten[A](list: List[List[A]]):List[A] = 
  if (list.length==0) List[A]() 
  else list.head ++ flatten(list.tail)

这个方法就像内置在List中的flatten方法一样。例如:

scala> flatten(List(List(1,2), List(3,4)))
res0: List[Int] = List(1, 2, 3, 4)

0
如果你想使用 flatmap,这里是方法:
假设你有一个名为 ll 的 List[List[Int]],你想要将它展开成 List,很多人已经给了你答案,比如 flatten,那是简单的方法。我假设你要使用 flatmap 方法,如果是这样,这里是方法:
ll.flatMap(_.map(o=>o))

这个答案与5年前Dave Griffith给出的答案有何不同?(除了旧答案更干净、更简洁之外。) - jwvh
你说得对,几乎一样。我相信我的代码更容易理解或者能给你一些下划线的提示。我传递了一个身份函数而不是身份关键字。希望这对你有意义。 - buqing
ll.flatMap(_) 会不会和 ll.flatMap(_.map(o=>o)) 做同样的事情? - akki
@akki,为什么不自己试试呢?这只需要一点时间:)。我敢打赌它不会起作用。因为函数文字中的“下划线”并不描述“身份”函数,而是表示该函数的参数应该用于描述某些逻辑。但是_ => _也不会起作用。 - srzhio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接