使用两个列表的Scala排列
问题描述:
请实现以下目标的最佳方法是什么? 我有两个列表:使用两个列表的Scala排列
val l1 = List("a", "b")
val l2 = List(1, 2)
,我想生成这个:
List (
List(('a', 1), ('b', 1)),
List(('a', 1), ('b', 2)),
List(('a', 2), ('b', 1)),
List(('a', 2), ('b', 2))
)
这基本上是第一个列表与第二组合创建的元组的列表清单? 正在考虑使用foldLeft与滑动(2,2)来获得我的结果,但不能得到正确的结果。
该溶液应与任何大小和类型,像列表( 'A', 'B', 'C')和列表工作( “1”, “2”)
由于
答
棘手比我想象的要多!第一步是计算l2的n次笛卡儿乘积,可以用List.fill
,combinations
,permutations
(我很难相信没有更简单的方法来做到这一点,但我没有'吨发现的任何):
def prod[T](lst: List[T], n: Int) = List.fill(n)(lst).flatten.combinations(n).flatMap(_.permutations)
的n
值由列表l1
的大小来确定。在你的例子prod(l2, 2)
将给我们List(List(1, 1), List(1, 2), List(2, 1), List(2, 2))
。其余的只是map
和zip
的应用。总之,我们有
l1 = List('a', 'b', 'c'), l2 = List("1", "2")
prod(l2, l1.size).map(l1.zip(_))
输出:
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))
+0
哇。非常好。实际上非常棘手。感谢您的快速转身。从代码片段中学到了很多东西 – jts 2014-11-24 10:00:18
你尝试过什么?解决方案非常简单。不禁想到这是作业... – gzm0 2014-11-24 09:39:12