将两个元组与嵌套列表理解结合起来
我有一个有趣的问题来弄清涉及嵌套列表理解。我会编辑这篇文章的不必要的细节,因为我试图解决的问题可能看起来有点奇特。将两个元组与嵌套列表理解结合起来
我有两个元组,如下所示("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? -}]
从初始化函数的返回值将被使用在一个更大的程序中,需要在这个3元组列表上执行任务。实际的两个元组("X", "Y", "Z")
和("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)
]
但是,如果你可以使用列表代替,也有执行Cartesian product的几种方法:
[[x++y | x <- ["A","B","C"]] | y <- ["1","2"]]
或者,如果你喜欢的单子列出解释:
import Control.Monad
combos = liftM2 (++)
init = combos ["A","B","C"] ["1","2"]
这很有帮助,但不完全正确。有更多的组合不仅仅是笛卡尔产品。笛卡尔产品将导致'[[“A1”,“B1”,“C1”],[“A2”,“B2”,“C2”]]。但是,这些字母不必按顺序排列,有些字母可能不会出现在其中一个结果中。 '[“C1”,“B2”,“B1”]'也是有效的组合。 – JavascriptLoser
@JavascriptLoser只是[选择3](https://stackoverflow.com/a/30285491/8387889)从六个 –
列表我不确定我明白你的意思,但使用代码从你链接的问题,''排列3 [“A”,“B”,“C”,“1”,“2”]'给我几乎所需的东西。该函数生成的列表的一个例子是'[“1”,“B”,“A”]'。我需要3双,其中一对是一个字母和一个数字。我不确定如何将您编写的代码与该问题的代码结合起来。 – JavascriptLoser
函数的实际输出以及它的类型应该是什么?如果你知道你的输入始终是相同的输入,为什么甚至有输入?在我看来,这可以简化为将所有列表替换为某个列表的长度(例如'[“1”,“2”]),然后将其中的每一个与其他输入进行压缩。 – user2407038
@ user2407038我在帖子中增加了一些额外的信息。 “输入”不是真正的输入,而是硬编码到'init'函数中。 – JavascriptLoser
请解释downvotes? – JavascriptLoser