我有一个有趣的问题要弄清楚涉及嵌套列表理解。我将编辑这篇文章不必要的细节,因此我试图解决的问题可能看起来有点奇怪。
我有两个元组如下("X", "Y", "Z")
和("1", "2")
。这些内容将永远如上所写。
使用这两个列表,我需要构建一个 3 元组列表,其中包含上述两个列表内容的每种组合。这些元组之一的一个例子是("X2", "Z2", "Y1)
. 注意数字总是在字母之后。
我知道我需要为此使用列表理解,但似乎我需要以某种方式进行嵌套列表理解,这是我不熟悉的。
我从这个开始:
[(comb1, comb2, comb2) | {- What goes here? -}]
我不知道如何继续。如何使用嵌套列表理解来解决这个问题?我相信嵌套列表理解是解决这个问题的最好方法,但如果你知道更好的方法,请解释一下。
编辑一些进一步的细节:
这个元组列表将由一个看起来像这样的函数输出:
init :: [(String, String, String)]
init = [(comb1, comb2, comb3) | {- What goes here? -}]
init 函数的返回值将用于需要在此 3 元组列表上执行任务的较大程序的上下文中。实际的两个元组("X", "Y", "Z")
and("1", "2")
将被硬编码到init
函数的列表理解中。
除了笛卡尔积给出的组合之外,还有更多的组合。笛卡尔积将导致[["X1","Y1","Z1"],["X2","Y2","Z2"]]
。但是,字母不必按顺序排列,有些字母可能根本不会出现在其中一个结果中。["Z1", "X2", "X1"]
也是一个有效的组合
它总是一个三元组和一个二元组吗?如果是这样,您不妨直接进行计算:
getInit (a,b,c) (x,y) =
[ (a++x,b++x,c++y)
, (a++y,b++y,c++y)
]
但是,如果您可以使用列表代替,则有几种方法可以执行笛卡尔积:
[[x++y | x <- ["A","B","C"]] | y <- ["1","2"]]
或者,如果您更喜欢 monads 列出推导式:
import Control.Monad
combos = liftM2 (++)
init = combos ["A","B","C"] ["1","2"]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句