gpt4 book ai didi

f# - 在 F# 中通过公共(public) ID 将多个数据列表合并在一起

转载 作者:行者123 更新时间:2023-12-04 11:44:08 25 4
gpt4 key购买 nike

我有来自 4 个不同来源的多个数据列表,其中包含一组公共(public) ID,我想根据 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 匹配所有源数据值?

最佳答案

看来您可以简单地连接所有列表,然后使用 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 use map`操作添加数据源的索引:
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),因此在对值进行迭代时,您可以使用 index 找出该项来自哪个数据源。使用 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# - 在 F# 中通过公共(public) ID 将多个数据列表合并在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com