亲爱的社区,您好,
我正在尝试在 Haskell 列表理解中组织元组序列。
例如我得到了以下列表理解:
[ (a,b,c,d) | a <- [0, 50, 100, 150, 200]
, b <- ['a', 'b', 'c']
, c <- [True, False]
, d <- ['A', 'B']
]
并得到:
[ (0, 'a', True, 'A'), (0, 'a', True, 'B'), (0, 'a', False, 'A')
, (0, 'a', False, 'B'), (0, 'b', True, 'A'), (0, 'b', True, 'B')
, (0, 'b', False, 'A'), (0, 'b', False, 'B'), (0, 'c', True, 'A')
,(0, 'c', True, 'B'), (0, 'c', False, 'A')..
现在我想要如下序列:
[ (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')..
这意味着:
首先是大写字母之间的权衡
'A'
& 'B'
,然后在小写字母之间进行权衡 'a'
, 'b'
, 'c'
,作为倒数第二个 bool 值之间的权衡 True
, False
最后是数字。不幸的是,我完全不知道如何实现这些,我想知道如何使用元组
[(a,b,c)]
操纵列表的序列.
最佳答案
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')]
(添加了新行以便于验证)
关于list - 在 Haskell 列表理解中组织元组序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46470375/