我正试图获得两个没有固定长度的列表的替代排列,例如:
x = ["a","b","c"]
y = [1,2,3]
应该返回:
[(a,1),(b,2),(c,3)] , [(a,2),(b,3),(c,1)], [(a,3),(b,1),(c,2)]
通过列表推导我能够得到这个:
[(x,y) | x<-x, y<-y ]
[("a",1),("a",2),("a",3),("b",1),("b",2),("b",3),("c",1),("c",2),("c",3)]
这不是我想要的
答案 0 :(得分:4)
您只需要对两个列表中的一个进行置换,然后将每个排列与原始顺序中的另一个列表配对:
import Data.List (permutations)
bijections :: [a] -> [b] -> [[(a, b)]]
bijections xs ys = map (zip xs) (permutations ys)
这样做会产生ys
的所有排列(因此对于您的示例来说是[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]
),然后对于每个排列,它将它们与xs
对齐原始订单。