Scala:如何将元组元素转换为列表

13 scala tuples higher-order-functions

假设我有以下元组列表:

val tuples = listOfStrings.map(string => {
            val split = string.split(":")
            (split(0), split(1), split(2))
        })
Run Code Online (Sandbox Code Playgroud)

我想在列表中得到split(0),在另一个列表中得到split(1),依此类推.这可以通过以下方式实现:

list1 = tuples.map(x => x._1).toList
list2 = tuples.map(x => x._2).toList
list3 = tuples.map(x => x._3).toList
Run Code Online (Sandbox Code Playgroud)

是否有更优雅(功能)的方式来实现上述内容而无需编写3个单独的语句?

Rég*_*les 12

这会将您的结果作为列表列表提供给您:

tuples.map{t => List(t._1, t._2, t._3)}.transpose
Run Code Online (Sandbox Code Playgroud)

如果要将它们存储在局部变量中,只需执行以下操作:

val List(l1,l2,l3) = tuples.map{t => List(t._1, t._2, t._3)}.transpose
Run Code Online (Sandbox Code Playgroud)

更新:正如Blaisorblade指出的那样,标准库实际上有一个内置的方法:unzip3这就像unzip三元组而不是对:

val (l1, l2, l3) = tuples.unzip3
Run Code Online (Sandbox Code Playgroud)

不用说,你应该赞成这种方法而不是上面的手动解决方案(但是对于arity> 3的元组,这仍然适用).


小智 10

你想要解压缩:

scala> val (numbers, homonyms) = List(("one", "won"), ("two", "too")).unzip
numbers: List[java.lang.String] = List(one, two)
homonyms: List[java.lang.String] = List(won, too)
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于对,而不适用于任何其他类型的元组 (2认同)