我正在尝试zip多个序列来形成一个长元组:
val ints = List(1,2,3)
val chars = List('a', 'b', 'c')
val strings = List("Alpha", "Beta", "Gamma")
val bools = List(true, false, false)
ints zip chars zip strings zip bools
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
List[(((Int, Char), String), Boolean)] =
List((((1,a),Alpha),true), (((2,b),Beta),false), (((3,c),Gamma),false))
Run Code Online (Sandbox Code Playgroud)
但是我想得到一系列扁平元组:
List[(Int, Char, String, Boolean)] =
List((1,a,Alpha,true), (2,b,Beta,false), (3,c,Gamma,false))
Run Code Online (Sandbox Code Playgroud)
我现在能做到:
List(ints, chars, strings, bools).transpose
Run Code Online (Sandbox Code Playgroud)
但它返回的是弱类型List[List[Any]].我也可以做(ints, chars, strings).zipped,但zipped只适用于2元组和3元组.
有没有办法轻松地压缩(任意)数量的等长序列?
我正在寻找以下列方式加入多个列表的方法:
ListA a b c
ListB 1 2 3 4
ListC + # * § %
..
..
..
Resulting List: a 1 + b 2 # c 3 * 4 § %
Run Code Online (Sandbox Code Playgroud)
单词:按顺序排列的元素,从第一个列表开始合并到结果列表中.任意数量的输入列表的长度可以不同.
我使用了zip的变体,滑动迭代器的多种方法但没有工作,特别是处理不同的列表长度.在scala中必须有一种优雅的方式;)
鉴于以下列表:
val l = List(List(1, 2, 3), List(4, 5), List(6, 7, 8))
Run Code Online (Sandbox Code Playgroud)
如果我尝试转置它,Scala将抛出以下错误:
scala> List.transpose(l)
java.util.NoSuchElementException: head of empty list
at scala.Nil$.head(List.scala:1365)
at scala.Nil$.head(List.scala:1362)
at scala.List$$anonfun$transpose$1.apply(List.scala:417)
at scala.List$$anonfun$transpose$1.apply(List.scala:417)
at scala.List.map(List.scala:812)
at scala.List$.transpose(List.scala:417)
at .<init>(<console>:6)
at .<clinit>(<console>)
at RequestResult...
Run Code Online (Sandbox Code Playgroud)
这是因为List.transpose假设等长列表,所以使用head方法:
def transpose[A](xss: List[List[A]]): List[List[A]] = {
val buf = new ListBuffer[List[A]]
var yss = xss
while (!yss.head.isEmpty) {
buf += (yss map (_.head))
yss = (yss map (_.tail))
}
buf.toList
}
Run Code Online (Sandbox Code Playgroud)
我想得到以下内容:
List(List(1, 4, 6), List(2, 5, …Run Code Online (Sandbox Code Playgroud) scala> val a = List(1,2)
a: List[Int] = List(1, 2)
scala> val b = List(3,4)
b: List[Int] = List(3, 4)
scala> val c = List(5,6)
c: List[Int] = List(5, 6)
scala> val d = List(7,8)
d: List[Int] = List(7, 8)
scala> (a,b,c).zipped.toList
res6: List[(Int, Int, Int)] = List((1,3,5), (2,4,6))
Run Code Online (Sandbox Code Playgroud)
现在:
scala> (a,b,c,d).zipped.toList
<console>:12: error: value zipped is not a member of (List[Int], List[Int], List[Int], List[Int])
(a,b,c,d).zipped.toList
^
Run Code Online (Sandbox Code Playgroud)
我想做以下或类似的事情:
for((itemA,itemB,itemC,itemD) <- (something)) yield itemA + itemB …Run Code Online (Sandbox Code Playgroud) 我有3个列表
val a = List("a", "b", "c")
val b = List(1, 2, 3)
val c = List(4, 5, 6)
Run Code Online (Sandbox Code Playgroud)
我想将它们转换如下
List(("a", 1, 4), ("b", 2, 5), ("c", 3, 6))
Run Code Online (Sandbox Code Playgroud)
请告诉我如何获得此结果