scala - 如何将列表转换为scala中的元组列表?
问题描述
输入:
Val l= List("k1","v1","k2","v2")
期望的输出:
List(("k1","v1"),("k2","v2"))
我尝试过使用拉链、折叠、切片,但没有成功。
注意:我已经在 python 中完成了它,但无法在 scala 中完成。
解决方案
我会这样做:
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)。
推荐阅读
- electron - 无法在 Windows 10 上使用 ffi 运行电子重建 (src\ffi.cc(228): error C2065: 'Handle': undeclared identifier)
- html - 根据组件值在角度组件之间画线的最佳做法是什么?
- excel - 如何在 VBA 中将 If 语句变成 For 循环
- python - 如何使用python从下拉列表中提取数据
- r - 比较数据帧中的单词并计算每个对的最大单词长度的矩阵
- regex - Ansible 正则表达式匹配字符串并提取行
- java - JDK 9.0.4 和 Derby 10.14.2 找不到创建的表
- angular - i18n 关于 Angular 7 中具有复数/选择的属性
- tfs - 如何启动由 TFS Release Agent 执行后不关闭的控制台程序
- mysql - 我可以比较同一个 MySQL 表 (SQL) 中的不同行吗