У меня есть последовательность пар (ключ, значение), какF #: группировка повторяющихся последовательностей элементов
[("a", 1), ("a", 2), ("a", 111), ("b", 3), ("bb", 1), ("bb", -1), ...]
, что является наиболее эффективным способом, чтобы преобразовать его в последовательность как
[("a", [1,2,111]), ("b", [3]), ("bb", [1,-1])]
или похожие?
Последовательность имеет следующие свойства: это действительно большой (> 2Gb)
Это делает Seq.groupBy действительно неэффективным и неправильным, есть ли другие способы сделать это?
PS: эта последовательность:
[("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: Последовательность большой, так ленивый (или самый быстрый) раствор является предпочтительным
Как выглядит seq.groupby неправильно? –
@JohnPalmer: groupBy использует [словарь внутри страны] (https://github.com/fsharp/fsharp/blob/37a100b7caafde0f4df5a1924c9f65f4a18277a8/src/fsharp/FSharp.Core/seq.fs#L1458), и я думаю, что это то, что OP хочет избежать. Похоже, что он похож на «uniq», где подсчитываются только соседние дубликаты. –
@AntonSchwaighofer - есть целая куча причин, почему groupby может быть неправильным - я пытался заставить OP сказать, что применимо к его ситуации - –