【问题标题】:Clean list comprehension for sampling from list of lists?从列表列表中采样的清洁列表理解?
【发布时间】:2014-11-25 10:10:42
【问题描述】:

我在 Haskell 中有一个列表。从每个列表中获取一个元素时,我想获得所有可能性。我目前拥有的是

a = [ [1,2], [10,20,30], [-1,-2] ] -- as an example
whatIWant = [ [p,q,r] | p <- a!!0, q <- a!!1, r <- a!!2 ]

这就是我想要的。但是,这显然不是很好的代码,我正在寻找一种更好的方法来编写列表理解,这样代码中就不会出现索引号(0,1,2)......这就是我所在的位置卡住了。

我该怎么做?

【问题讨论】:

  • 您是否坚持使用列表推导式来做这件事?我认为对于这样的任务,函数更好更干净。
  • @JanŽegklitz 感谢您的评论。并不是我坚持这一点:我只是觉得有一个很好的和干净的方式来编写列表理解,并且根本不知道这是否可能。
  • 您想要所有列表的笛卡尔积。使用sequence a 来实现这一点。 stackoverflow.com/questions/3387359/…

标签: haskell list-comprehension


【解决方案1】:

使用函数(内部使用列表理解),我的解决方案是

combinations :: [[a]] -> [[a]]
combinations [] = []
combinations [l] = map (\ x -> [x]) l
combinations (x:xs) = combine (combinations [x]) (combinations xs)
    where combine a b = [ p ++ q | p <- a, q <- b ]

例子:

*Main> combinations [[1, 2, 3], [4, 5, 6]]
[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]
*Main> combinations [['a', 'b', 'c'], ['A', 'B', 'C'], ['1', '2']]
["aA1","aA2","aB1","aB2","aC1","aC2","bA1","bA2","bB1",...
 "bB2","bC1","bC2","cA1","cA2","cB1","cB2","cC1","cC2"]

编辑:当然你可以使用 sequence 函数,正如 cmets 中所建议的那样:

*Main> sequence [['a', 'b', 'c'], ['A', 'B', 'C'], ['1', '2']]
["aA1","aA2","aB1","aB2","aC1","aC2","bA1","bA2","bB1",...
 "bB2","bC1","bC2","cA1","cA2","cB1","cB2","cC1","cC2"]

【讨论】:

    【解决方案2】:

    这显然不是一个好代码

    考虑到输入是列表列表的限制,这是您可以做到的最佳方式。

    如果您使用不同的类型,例如三组列表,然后您可以在结构上进行索引。例如

    Prelude> let x@(a,b,c) = ( [1,2],  [10,20,30], [-1,-2] )
    

    让你写:

    Prelude> [ (p,q,r) | p <- a , q <- b , r <- c ]
    [(1,10,-1),(1,10,-2),(1,20,-1)
    ,(1,20,-2),(1,30,-1),(1,30,-2)
    ,(2,10,-1),(2,10,-2),(2,20,-1)
    ,(2,20,-2),(2,30,-1),(2,30,-2)]
    

    课程:为避免索引,请使用其结构捕获您想要保留的不变量的类型。将数据的维度提升为其类型。

    【讨论】:

    • 如果我必须处理大型列表(x@(a,b,c, ....,z, za..)) 怎么办?我应该寻求@JanŽegklitz 建议的功能吗? // 我只在模式匹配的上下文中知道@,很高兴知道。
    猜你喜欢
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多