将两个元组与嵌套列表理解结合起来

将两个元组与嵌套列表理解结合起来

问题描述:

我有一个有趣的问题来弄清涉及嵌套列表理解。我会编辑这篇文章的不必要的细节,因为我试图解决的问题可能看起来有点奇特。将两个元组与嵌套列表理解结合起来

我有两个元组,如下所示("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"]也是一个有效的组合

+1

函数的实际输出以及它的类型应该是什么?如果你知道你的输入始终是相同的输入,为什么甚至有输入?在我看来,这可以简化为将所有列表替换为某个列表的长度(例如'[“1”,“2”]),然后将其中的每一个与其他输入进行压缩。 – user2407038

+0

@ user2407038我在帖子中增加了一些额外的信息。 “输入”不是真正的输入,而是硬编码到'init'函数中。 – JavascriptLoser

+0

请解释downvotes? – JavascriptLoser

它总是一个三元组和二元组吗?如果是这样,你还不如干脆直接做计算:

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"] 
+0

这很有帮助,但不完全正确。有更多的组合不仅仅是笛卡尔产品。笛卡尔产品将导致'[[“A1”,“B1”,“C1”],[“A2”,“B2”,“C2”]]。但是,这些字母不必按顺序排列,有些字母可能不会出现在其中一个结果中。 '[“C1”,“B2”,“B1”]'也是有效的组合。 – JavascriptLoser

+0

@JavascriptLoser只是[选择3](https://stackoverflow.com/a/30285491/8387889)从六个 –

+0

列表我不确定我明白你的意思,但使用代码从你链接的问题,''排列3 [“A”,“B”,“C”,“1”,“2”]'给我几乎所需的东西。该函数生成的列表的一个例子是'[“1”,“B”,“A”]'。我需要3双,其中一对是一个字母和一个数字。我不确定如何将您编写的代码与该问题的代码结合起来。 – JavascriptLoser