F#数组处理:将输入数组转换为Seq of Seqs序列
Got it,我来帮你搞定这个F#的需求,咱们一步步拆解实现:
完整实现代码
module SOQN = open System let first = [| "C"; "D"; "C"; "E"; "B"; "A"; "A"; "E"; "A"; "B"; "A"; "D"; "B"; "E" |] let second = [| "No"; "No"; "Yes"; "Yes"; "Yes"; "No"; "Yes"; "No"; "Yes"; "Yes"; "Yes"; "Yes"; "Yes"; "No" |] let fltr = [| "No"; "Yes" |] let filterProduct (firstArr:string[]) (secondArr:string[]) (filterTags:string[]) = // 1. 把前两个数组对齐成你要的元组数组格式 let pairedItems = Array.zip firstArr secondArr // 2. 按第一个数组的类别分组,把同类别项归拢到一起 pairedItems |> Seq.groupBy fst |> Seq.map (fun (category, categoryGroup) -> // 3. 遍历过滤标签,统计每个标签在当前类别里的出现次数 filterTags |> Seq.map (fun tag -> let tagCount = categoryGroup |> Seq.filter (fun (_, t) -> t = tag) |> Seq.length (category, (tag, tagCount)) ) ) // 调用函数生成目标序列 let finalResult = filterProduct first second fltr
代码逻辑拆解
- 对齐数组:用
Array.zip直接将first和second配对成[|("C", "No"); ("C", "Yes"); ...|]的元组数组,这一步完全符合你要的初始格式。 - 按类别分组:通过
Seq.groupBy fst把配对后的元素按类别(比如"C"、"D")分组,这样同一类别下的所有标签项都被聚在一起,方便后续统计。 - 统计过滤标签次数:对每个类别分组,遍历
fltr里的标签,筛选出对应标签的项并统计数量,最后把类别和(标签,计数)组合成元组,每个类别对应的这些元组就构成一个子序列,最终形成seq of seqs的结构。
输出结果示例
运行后finalResult的结构如下,完全匹配你的需求:
seq [ seq [("A", ("No", 1)); ("A", ("Yes", 3))]; seq [("B", ("No", 0)); ("B", ("Yes", 3))]; seq [("C", ("No", 1)); ("C", ("Yes", 1))]; seq [("D", ("No", 1)); ("D", ("Yes", 1))]; seq [("E", ("No", 2)); ("E", ("Yes", 1))] ]
如果你希望每个子序列是单个包含类别+所有标签计数的三元组(比如你给出的seq [("C", ("No", 1), ("Yes", 1))]格式),可以修改map内的逻辑为:
Seq.singleton ( category, ("No", categoryGroup |> Seq.filter (fun (_, t) -> t = "No") |> Seq.length), ("Yes", categoryGroup |> Seq.filter (fun (_, t) -> t = "Yes") |> Seq.length) )
这种写法适配固定两个过滤标签的场景,输出的子序列就是单个三元组的形式。
内容的提问来源于stack exchange,提问作者matekus
相关产品推荐
相关产品推荐

