【问题标题】:How to flatten a tuple of lists to a list of lists in Scala如何将列表元组展平为Scala中的列表列表
【发布时间】:2013-11-06 15:19:59
【问题描述】:

我是 Scala 的新手,我正在寻找一种方法来做类似的事情

val list = List(1, 0, 1, 2, 3, 1, 2, 0, 1, 2, 0, 3, 2, 0, 1)

mylist.sortWith(_ > _).partition(_ == 1).flatten

问题是 partition() 产生一个列表元组,但我需要一个列表列表。

目标是在不使用其他变量的情况下在一行中完成这项工作,不需要优化。

实现我想要做的事情的肮脏/愚蠢的方式是:

List(mylist.sortWith(_ > _).partition(_ == 1)._1, mylist.sortWith(_ > _).partition(_ == 1)._2).flatten

我也想知道是否可以将 partition() 的输出转换为扁平化

【问题讨论】:

  • 所以您想要List(1, 1, 1, 1, 1, 3, 3, 2, 2, 2, 2, 0, 0, 0, 0) 的最终输出?这就是我运行您的“肮脏/愚蠢”方法的原因。
  • 是的,但输出并不重要:)
  • 模式匹配。见*.com/q/7129849/770361

标签: list scala type-conversion tuples flatten


【解决方案1】:

这是一种方法:

list.sorted.groupBy(_ == 1).values.toList
  • sorted() 只是按升序对列表进行排序(可行,因为它只包含 Ints)
  • groupBy() 将其转换为 true -> 1's, false -> all else 的映射
  • values() 返回地图的值
  • toList() 将此地图值的集合转换为您想要的列表。

【讨论】:

  • 为什么要使用sorted
  • 原始问题对列表进行了排序。或者你的意思是另一种排序方法在这里会更好?
  • 哦对不起..我的错!我没注意到!
【解决方案2】:

这似乎是 Scala 的一个缺失特性,“一种将元组转换为列表的方法”,但您可以使用 productIterator 来实现...... ProductIterator 返回一个 List[Any] 所以它很丑但是你可以这样做:

  val list = List(1, 0, 1, 2, 3, 1, 2, 0, 1, 2, 0, 3, 2, 0, 1)

  list
    .sortBy(-_)
    .partition( _ == 1 )
    .productIterator.map( _.asInstanceOf[List[Int]] )
    .toList.flatten

 // Results in: List(1, 1, 1, 1, 1, 3, 3, 2, 2, 2, 2, 0, 0, 0, 0)

只是为了展示精湛的技艺,您也可以得到相同的答案

list.sortBy(-_).foldLeft(List[Int]()){case (a,1) => 1 +: a case (a,v) => a :+ v}

或:

list.sortBy(-_).sortWith((a,b) => a == 1)    

【讨论】:

  • 1.您可以使用.asInstanceOf[Iterator[List[Int]]] 而不是map。 2. 你的sortWith 没有按预期工作
  • Right list.sortWith((a,b) => a == 1 || a > b) 不起作用,但其他 2 个解决方案很好,谢谢 @LuigiPlinge 我不明白为什么我必须投到 Iterator[List[Int]] 但我会看看它。也谢谢
  • @LuigiPlinge 是对的,我需要新眼镜...我更改了示例,但可惜它并不那么聪明。
  • @mike "cast", _.asInstanceOf[List[Int]],需要让 flatten 方法工作。
最近更新 更多