2017-08-27 150 views
0

我有一個有趣的問題來弄清涉及嵌套列表理解。我會編輯這篇文章的不必要的細節,因爲我試圖解決的問題可能看起來有點奇特。將兩個元組與嵌套列表理解結合起來

我有兩個元組,如下所示("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

回答

1

它總是一個三元組和二元組嗎?如果是這樣,你還不如干脆直接做計算:

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