2016-09-28 54 views
4

有沒有辦法,我可以合併2所列出F#交錯2列出

let a = ["a"; "b"; "c"] 
let b = ["d"; "b"; "a"] 

的方式,所以我得到這個結果

result = ["a"; "d"; "b"; "b"; "c"; "a"] 
+1

是你試圖找到自己的解決方案? –

回答

5

快速&骯髒的解決辦法是將壓縮兩個列表,然後平坦化所得的元組:

let interleave a b = 
    List.zip a b |> List.collect (fun (a,b)-> [a;b]) 

此方法返回交錯元素的列表:

interleave a b;; 
val it : string list = ["a"; "d"; "b"; "b"; "c"; "a"] 

zip將從兩個列表的元素創建對:

val it : (string * string) list = [("a", "d"); ("b", "b"); ("c", "a")] 

collect將壓平的元組

3

爲了補充@Panagiotis Kanavos的標準基於庫的答案,這裏有一個手實現它應該消耗略少的內存,因爲它不會構建元組(但仍需要中間列表):

let interleave a b = 
    let rec loop acc a b = 
     match a, b with 
     | [], l | l, [] -> List.rev l @ acc 
     // Or if you want to fail when the lengths are different, replace the above with: 
     // | [], [] -> acc 
     // | [], _ | _, [] -> failwith "interleave: List lengths are different" 
     | a :: aa, b :: bb -> loop (b :: a :: acc) aa bb 
    loop [] a b |> List.rev 

(中this link解決方案不是尾遞歸,所以次優太)

8

這個任務是最好的解決foldBack2

let al = ["a"; "b"; "c"] 
let bl = ["d"; "b"; "a"] 

List.foldBack2 (fun a b xs -> a :: b :: xs) al bl [] 
// ["a"; "d"; "b"; "b"; "c"; "a"]