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

Posted

技术标签:

【中文标题】Scala - 将列表转换为单个列表:List[List[A]] 到 List[A]【英文标题】:Scala - convert List of Lists into a single List: List[List[A]] to List[A] 【发布时间】:2012-09-18 00:40:09 【问题描述】:

在 scala (2.9) 中转换列表的最佳方法是什么?

我有一个清单:

List[List[A]]

我想转换成的

List[A]

如何递归实现?或者有没有其他更好的方法?

【问题讨论】:

【参考方案1】:

鉴于上述示例,我不确定您是否需要递归。看起来你想要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)

【讨论】:

【参考方案2】:

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

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

【讨论】:

你将如何展平这个List(1, List(2,3), 4, List(5,6,7)) 预期结果是List(1, 2, 3, 4, 5,6,7) 上面的列表是异构的,flatten 不会在那里工作。您可以执行以下操作: List(1, List(2,3), 4, List(5,6,7)).collectcase i:Int => List(i);案例 l @ a :: b => l.flatten【参考方案3】:

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

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

和理解等价物

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

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

【讨论】:

如果你想在地图中添加一些数据,这就是你想要的。 有趣的是,IDEA 建议我将 listOfLists.flatMap(identity) 更改为 listOfLists.flatten【参考方案4】:

你不需要递归,但你可以根据需要使用它:

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)

【讨论】:

【参考方案5】:

如果你的结构可以进一步嵌套,比如:

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)

【讨论】:

【参考方案6】:

如果你想使用平面地图,这里是方法

假设您有一个名为 ll 的 List[Int] 列表,并且您希望将其展平为 List, 很多人已经给你答案了,比如扁平化,这是最简单的方法。我假设您要求使用 flatmap 方法。如果是这样的话,这里是方法

ll.flatMap(_.map(o=>o))

【讨论】:

这个答案与 5 年前 Dave Griffith 给出的答案有何不同? (除了旧答案更简洁更简洁的事实。) 你是对的,几乎一样。我相信我的更容易理解或给你一些下划线的打击。我正在传递一个身份函数而不是身份关键字。希望对你有意义 ll.flatMap(_) 也会和ll.flatMap(_.map(o=&gt;o)) 做同样的事情吗? @akki,你为什么不自己试试呢?这是片刻的工作:)。我敢打赌这行不通。由于函数文字中的“下划线”不描述“身份”函数,它意味着该函数的一个参数应该用于描述一些逻辑。但是_ =&gt; _ 也不起作用。

以上是关于Scala - 将列表转换为单个列表:List[List[A]] 到 List[A]的主要内容,如果未能解决你的问题,请参考以下文章

将 Scala 中的列表转换为 Python 列表或数据帧

将 Scala 列表转换为元组?

使用 Python 将多个字符串元素列表转换为单个元素以逗号分隔的列表

Scala - 将地图列表转换为地图

如何使用Java8流将列表列表转换为单个列表[重复]

Scala 使用求和逻辑按属性从列表转换为映射