【问题标题】:Merge multiple lists of data together by common ID in F#在 F# 中通过公共 ID 将多个数据列表合并在一起
【发布时间】:2011-06-14 19:21:00
【问题描述】:

我有来自 4 个不同来源的多个数据列表,我想根据 ID 将它们合并在一起,最终得到一个新列表,每个 ID 一个,每个来源一个条目.

来自 4 个来源的输出列表中的对象如下所示:

type data = {ID : int; value : decimal;}

所以,例如我会:

let sourceA = [data1, data2, data3];
let sourceB = [data1, data2, data3];
let sourceC = [data1, data2, data3];
let sourceD = [data1, data2, data3];

(我意识到这段代码是无效的,只是想给出一个基本的想法......列表实际上是从数据库中提取和生成的)

然后我想获取 sourceA、sourceB、sourceC 和 sourceD 并将它们处理成一个包含以下对象的列表:

type dataByID = {ID : int; valueA : decimal; valueB : decimal; valueC : decimal; valueD : decimal; }

...这样我就可以在 CSV 中将它们打印出来,第一列是 ID,coulmns 2 - 5 是来自源 A - D 的数据,对应于该行中的 ID。

我对 F# 完全陌生,那么处理这些数据以便我按 ID 匹配所有源数据值的最佳方法是什么??

【问题讨论】:

    标签: f# f#-data


    【解决方案1】:

    您似乎可以简单地连接所有列表,然后使用Seq.groupBy 获取一个列表,其中包含输入列表中的唯一 ID 以及与该 ID 关联的所有值。这可以使用类似的方法来完成:

    let data = 
      [ data1; data2; data3; data4 ]   // Create list of lists of items 
      |> Seq.concat                    // Concatenate to get a single list of items
      |> Seq.groupBy (fun d -> d.ID)   // Group elements by ID
    
    seq { for id, values in data -> 
            // ID is the id and values is a sequence with all values 
            // (that come from any data source) }
    

    如果要关联数据源(无论是data1data2, etc...) with the value then you can first usemap`操作添加数据源的索引:

    let addIndex i data = 
      data |> Seq.map (fun v -> i, v)
    
    let data = 
      [ List.map (addIndex 1) data1;
        List.map (addIndex 2) data2;
        List.map (addIndex 3) data3;
        List.map (addIndex 4) data4 ]
      |> Seq.concat
      |> Seq.groupBy (fun (index, d) -> d.ID)
    

    现在,data 还包含数据源的索引(从 1 到 3),因此在对值进行迭代时,您可以使用索引来找出该项来自哪个数据源。更好的版本可以使用Seq.mapi 来迭代数据源列表并自动为所有值添加索引:

    let data = 
      [ data1; data2; data3; data4 ]
      |> Seq.mapi (fun index data -> Seq.map (addIndex index) data)
      |> Seq.concat
      |> Seq.groupBy (fun (index, d) -> d.ID)
    

    【讨论】:

    • 正如我所说,对 F# 完全陌生...我想我明白了基本的想法,但是一个快速的代码示例会非常有帮助。
    • @Adam:添加了一些示例 :-)
    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 2022-11-28
    • 2021-02-03
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多