代码之家  ›  专栏  ›  技术社区  ›  matekus

F#两个数组-按第二个数组上的索引过滤的第一个数组乘积

  •  2
  • matekus  · 技术社区  · 8 年前

    我有三个阵列- 第一 是浮点数组, 第二 是字符串数组,并且 fltr公司 是字符串数组。我需要根据第二个数组中的匹配索引是否包含过滤器数组元素中的所有字符来生成第一个数组中元素的乘积:

    module SOQN = 
    
       open System
    
       let first   = [| 2.00;   3.00;   5.00;   7.00;   11.00 |]
       let second  = [| "ABCD"; "ABCE"; "ABDE"; "ACDE"; "BCDE" |]
       let fltr    = [| "AC";   "BD";   "CE" |]
    
       let result =
          first
          |> Array.filter second // filter for elements containing characters in second array
          |> Seq.reduce (fun x y -> x * y)
    
       // Expected Result: let result = [| 42.00; 110.00; 231.00 |]
    

    如何生成产品阵列?

    2 回复  |  直到 8 年前
        1
  •  2
  •   xuanduc987    8 年前

    像这样的

    let first   = [| 2.00;   3.00;   5.00;   7.00;   11.00 |]
    let second  = [| "ABCD"; "ABCE"; "ABDE"; "ACDE"; "BCDE" |]
    let fltr    = "AC"
    
    Array.zip first second
    |> Array.filter (fun (_, s) ->
        Seq.forall (fun c -> s.Contains (string c)) fltr)
    |> Array.map fst
    |> Array.reduce (*)
    
        2
  •  1
  •   matekus    8 年前

    下面的代码片段(虽然不是惯用的)提供了我所寻求的完整答案,包括@xuanduc987解决方案:

    module SOANS = 
    
    open System
    
    let first   = [| 2.00;   3.00;   5.00;   7.00;   11.00 |]
    let second  = [| "ABCD"; "ABCE"; "ABDE"; "ACDE"; "BCDE" |]
    let fltr    = [| "AC";   "BD";   "CE" |]
    
    let filterProduct (first:float[]) (second:string[]) (fltr:string) = 
        Array.zip first second
        |> Array.filter (fun (_, s) ->
            Seq.forall (fun c -> s.Contains (string c)) fltr)
        |> Array.map fst
        |> Array.reduce (*)
    
    let third = 
        [for i in [0..fltr.Length - 1] do
            yield (filterProduct first second fltr.[i])]
        |> List.toArray
    
    printfn "Third: %A" third
    
    // Expected Result: Third: [| 42.0; 110.0; 231.0 |]
    // Actual Result    Third: [| 42.0; 110.0; 231.0 |]