列表理解中x <- list 语句的顺序 很重要。如果你写:
[expr | x <- list1, y <- list2]
这相当于一个嵌套的 for 循环,y 是内部循环。因此,带有循环的 Python 等效项是:
for x in list1:
for y in list2:
expr
因此,在外部循环选择下一个值之前,内部循环已完全耗尽。
所以我们需要重新排序语句,这样我们首先选择d,然后是b,然后是c,最后是a。所以这意味着我们转向:
[(a,b,c,d)| a <- [0,50..200], b <- "abc", c <- [True,False], d <-"AB"]
(我使列表的符号更短)
进入:
-- [(a,b,c,d)| a <- [0,50..200], b <- "abc", c <- [True,False], d <-"AB"]
-- | \_________/_____ |
-- | ________/ \ |
-- | / \ |
[(a,b,c,d)| a <- [0,50..200], c <- [True,False], b <- "abc", d <- "AB"]
(评论只是为了形象化差异)
生成:
Prelude> [(a,b,c,d)| a <- [0,50..200], c <- [True,False], b <- "abc", d <- "AB"]
[(0,'a',True,'A'),
(0,'a',True,'B'),
(0,'b',True,'A'),
(0,'b',True,'B'),
(0,'c',True,'A'),
(0,'c',True,'B'),
(0,'a',False,'A'),
(0,'a',False,'B'),
(0,'b',False,'A'),
(0,'b',False,'B'),
(0,'c',False,'A'),
(0,'c',False,'B'),
(50,'a',True,'A'),
(50,'a',True,'B'),
(50,'b',True,'A'),
(50,'b',True,'B'),
(50,'c',True,'A'),
(50,'c',True,'B'),
(50,'a',False,'A'),
(50,'a',False,'B'),
(50,'b',False,'A'),
(50,'b',False,'B'),
(50,'c',False,'A'),
(50,'c',False,'B'),
(100,'a',True,'A'),
(100,'a',True,'B'),
(100,'b',True,'A'),
(100,'b',True,'B'),
(100,'c',True,'A'),
(100,'c',True,'B'),
(100,'a',False,'A'),
(100,'a',False,'B'),
(100,'b',False,'A'),
(100,'b',False,'B'),
(100,'c',False,'A'),
(100,'c',False,'B'),
(150,'a',True,'A'),
(150,'a',True,'B'),
(150,'b',True,'A'),
(150,'b',True,'B'),
(150,'c',True,'A'),
(150,'c',True,'B'),
(150,'a',False,'A'),
(150,'a',False,'B'),
(150,'b',False,'A'),
(150,'b',False,'B'),
(150,'c',False,'A'),
(150,'c',False,'B'),
(200,'a',True,'A'),
(200,'a',True,'B'),
(200,'b',True,'A'),
(200,'b',True,'B'),
(200,'c',True,'A'),
(200,'c',True,'B'),
(200,'a',False,'A'),
(200,'a',False,'B'),
(200,'b',False,'A'),
(200,'b',False,'B'),
(200,'c',False,'A'),
(200,'c',False,'B')]
(添加了新行以便于验证)