首页 > 解决方案 > 如何将列表转换为scala中的元组列表?

问题描述

输入: Val l= List("k1","v1","k2","v2")

期望的输出:

List(("k1","v1"),("k2","v2"))

我尝试过使用拉链、折叠、切片,但没有成功。

注意:我已经在 python 中完成了它,但无法在 scala 中完成。

标签: scalaspark-shell

解决方案


我会这样做:

List("k1","v1","k2","v2")
  .grouped(2) // groups into a Lists of up to 2 elements
  .collect { case List(a, b) => a -> b } // maps to tuples while dropping possible 1-element list
  .toList // converts from Iterable to List

但是,如果没有grouped

list.foldLeft(List.empty[(String, String)] -> (None: Option[String])) {
  case ((result, Some(key)), value) =>  (result :+ (key -> value)) -> None
  case ((result, None), key) =>         result -> Some(key)
}._1

或者

def isEven(i: Int) = i % 2 == 0

val (keys, values) = list.zipWithIndex.partition(p => isEven(p._2))

(key zip values).map { case ((k, _), (v, _)) => k -> v }

当然,如果性能真的很关键,我会以稍微不同的方式实现它以避免分配(例如,通过在 foldLeft 中添加结果并反转最终结果,或者使用 tailrec 或 ListBuffer)。


推荐阅读