Scala排列使用两个列表

jts*_*jts 9 scala

请问以下最好的方法是什么?我有两个清单:

val l1 = List("a", "b") 
val l2 = List(1, 2) 
Run Code Online (Sandbox Code Playgroud)

我想生成这个:

 List (
    List(('a', 1), ('b', 1)),
    List(('a', 1), ('b', 2)),
    List(('a', 2), ('b', 1)),
    List(('a', 2), ('b', 2))
  )  
Run Code Online (Sandbox Code Playgroud)

哪个基本上是第一个列表与第二个列表组合创建元组列表?考虑使用带滑动(2,2)的foldLeft来获得我的结果,但不能只是得到正确的结果.

解决方案应该适用于任何大小和类型,如List('a','b','c')和List("1","2")

谢谢

mis*_*ner 14

比我想象的更狡猾!第一步是计算n次L2的笛卡尔积,可使用的组合来完成List.fill,combinationspermutations(我有一个很难相信,有做这种没有更简单的方法,但我还没有发现任何):

def prod[T](lst: List[T], n: Int) = List.fill(n)(lst).flatten.combinations(n).flatMap(_.permutations)
Run Code Online (Sandbox Code Playgroud)

n由列表的大小决定l1.在你的例子中prod(l2, 2)将给我们List(List(1, 1), List(1, 2), List(2, 1), List(2, 2)).剩下的只是一个应用程序mapzip.我们在一起

prod(l2, l1.size).map(l1.zip(_))
Run Code Online (Sandbox Code Playgroud)

输出l1 = List('a', 'b', 'c'), l2 = List("1", "2"):

List((a,1), (b,1), (c,1))
List((a,1), (b,1), (c,2))
List((a,1), (b,2), (c,1))
List((a,2), (b,1), (c,1))
List((a,1), (b,2), (c,2))
List((a,2), (b,1), (c,2))
List((a,2), (b,2), (c,1))
List((a,2), (b,2), (c,2))
Run Code Online (Sandbox Code Playgroud)


lpa*_*pan 8

最好的方法是使用 a 进行理解。比国际海事组织接受的解决方案干净得多:)

for {
  i1 <- List('a', 'b', 'c')
  i2 <- List(1, 2)
} yield List(i1, i2)
Run Code Online (Sandbox Code Playgroud)

  • 它不会生成问题所要求的确切输出,但它回答了标题中的问题:它生成列表的所有排列(如“List”)。当谷歌把我带到这里时,这就是我想要的。 (2认同)