例如假设我有
val letters = ('a', 'b', 'c', 'd', 'e')
val numbers = (1, 2)
是否可以生成列表
(('a',1), ('b',2), ('c',1),('d',2),('e',1))
答案 0 :(得分:31)
你的字母和数字是元组,而不是列表。所以让我们解决这个问题
scala> val letters = List('a', 'b', 'c', 'd', 'e')
letters: List[Char] = List(a, b, c, d, e)
scala> val numbers = List(1,2)
numbers: List[Int] = List(1, 2)
现在,如果我们将它们压缩,我们就无法获得所需的结果
scala> letters zip numbers
res11: List[(Char, Int)] = List((a,1), (b,2))
但这表明,如果数字无限重复,那么问题就会得到解决
scala> letters zip (Stream continually numbers).flatten
res12: List[(Char, Int)] = List((a,1), (b,2), (c,1), (d,2), (e,1))
不幸的是,这是基于数字比字母短的知识。所以要解决所有问题
scala> ((Stream continually letters).flatten zip (Stream continually numbers).flatten take (letters.size max numbers.size)).toList
res13: List[(Char, Int)] = List((a,1), (b,2), (c,1), (d,2), (e,1))
答案 1 :(得分:7)
较短的列表需要无限期重复。在这种情况下,很明显numbers
更短,但如果你需要它一般工作,这就是你如何做到这一点:
def zipLongest[T](list1 : List[T], list2 : List[T]) : Seq[(T, T)] =
if (list1.size < list2.size)
Stream.continually(list1).flatten zip list2
else
list1 zip Stream.continually(list2).flatten
val letters = List('a', 'b', 'c', 'd', 'e')
val numbers = List(1, 2)
println(zipLongest(letters, numbers))
答案 2 :(得分:1)
你可以使用map
方法
val letters = List('a', 'b', 'c', 'd', 'e')
val numbers = List(1, 2)
val longZip1 = letters.zipWithIndex.map( x => (x._1, numbers(x._2 % numbers.length)) )
//or, using a for loop
//for (x <- letters.zipWithIndex) yield (x._1, numbers(x._2 % numbers.size))
答案 3 :(得分:0)
如果您不想重复使用任何列表数据,那么您需要知道要提前填补的差距:
val result = (0 to (Math.max(list1.size, list2.size) - 1)) map { index =>
(list1.lift(index).getOrElse(valWhen1Empty),list2.lift(index).getOrElse(valWhen2Empty))
}
我怀疑这对于无限列表或流程当然会很好...