Haskell 两个列表的交替排列
我试图得到两个列表的替代排列,没有固定长度,例如:Haskell 两个列表的交替排列,haskell,Haskell,我试图得到两个列表的替代排列,没有固定长度,例如: 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)]
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)]
[(x,y)| x您只需排列两个列表中的一个,然后按原始顺序将每个排列与另一个列表配对:
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
配对。您只需排列两个列表中的一个,然后按照原始顺序将每个排列与另一个列表配对:
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
配对。使用和zip
应该可以让你达到目的。哦,有什么原因你只考虑[1,2,3]的一半排列吗?(例如[3,2,1]不存在)对我来说,重要的是每个字母都与每个数字匹配,列表中的顺序并不重要,例如[(a,1),(b,2),(c,3)]=[(c,3),(b,2),(a,1)]啊,是的,但你似乎错过了匹配的[(a,3),(b,2),(c,1)]
,还有另外两个,在你的例子中。使用和zip
应该能让你达到目的。哦,你只考虑[1,2,3]的一半排列有什么原因吗?(例如[3,2,1]不存在)对我来说重要的是每个字母都与每个数字匹配,列表中的顺序并不重要,例如[a,1)、(b,2)、(c,3]==[(c,3),(b,2),(a,1)]啊,是的,但是在你的例子中,你似乎错过了匹配的[(a,3),(b,2),(c,1)]
,以及另外两个。