gpt4 book ai didi

F#:按重复出现的元素序列分组

转载 作者:行者123 更新时间:2023-12-05 08:42:48 25 4
gpt4 key购买 nike

我有一个序列对(键,值)就像

[("a", 1), ("a", 2), ("a", 111), ("b", 3), ("bb", 1), ("bb", -1), ...]

, 什么是最有效的把它转换成像这样的序列

[("a", [1,2,111]), ("b", [3]), ("bb", [1,-1])] 

或类似的?

序列具有以下属性:它真的很大(>2Gb)

这使得 Seq.groupBy 真的无效且不正确,还有其他方法吗?

附言:这个序列:

[("a", 1), ("a", 2), ("a", 111), ("bb", 1), ("bb", -1), ("a", 5), ("a", 6), ...]

应转换为

[("a", [1,2,111]), ("bb", [1,-1]), ("a", [5,6]), ...]

--

编辑 #1:修复了不正确的样本

编辑 #2:序列很大,因此首选惰性(或最快)解决方案

最佳答案

如果您想要获得惰性结果的选项,那么我认为没有维护可变状态的优雅方法。这是一个相对简单的突变。您维护您看到的最后一个键的存储,以及与之对应的所有值:

let s = [("a", 1); ("a", 2); ("a", 111); ("bb", 1); ("bb", -1); ("a", 5); ("a", 6)]
let s2 =
[
let mutable prevKey = None
let mutable values = System.Collections.Generic.List<_>()
let init key value =
prevKey <- Some key
values.Clear()
values.Add value
for (key, value) in s do
match prevKey with
| None -> init key value
| Some k when k = key -> values.Add value
| Some k ->
yield (k, List.ofSeq values)
init key value
match prevKey with
| Some k -> yield (k, List.ofSeq values)
| _ -> ()
]

这给出:

val s2 : (string * int list) list =
[("a", [1; 2; 111]); ("bb", [1; -1]); ("a", [5; 6])]

对于惰性评估,将 [ ... ] 替换为 seq { ... }

关于F#:按重复出现的元素序列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38395578/

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