f# - F# 和 Series,如何编写 Series.choose?
问题描述
我决定编写一个 Series.choose 函数,类似于我们在 Seq 上的函数,我想知道您是否认为这是编写它的最佳方式,回到 Seq,因为那里有一个函数。
let choose (f: 'K * 'V -> ('K * 'U) option) (e : Series<'K,'V>) =
e |> Series.map (fun k v -> k, v)
|> Series.values
|> (Seq.choose f)
|> Series.ofValues
|> Series.map (fun _ v -> snd v)
|> Series.indexWith (e |> Series.keys)
谢谢
解决方案
mapAll
几乎是您所需要的,只是签名略有不同(特别是不能更改密钥)。如果您确实需要更改密钥,它会变得更加困难,但仍然不需要通过Seq
. 它还取决于您希望如何处理e
.
未经测试(因为我这里没有 Visual Studio),并假设e
没有缺失值,但应该给出这个想法:
let choose (f: 'K * 'V -> ('K * 'U) option) (e : Series<'K,'V>) =
e |> Series.mapAll (fun k (Some v) -> f (k, v)) // Series<'K, ('K, 'U)>
|> Series.dropMissing // drops cases where f returned None
|> fun e1 -> e1.SelectKeys (fun kvp -> fst kvp.Value.Value) // changes the keys to the ones f returned
|> Series.mapValues snd // removes the keys from the values
推荐阅读
- powershell - Connect-VIServer 无法连接,因为证书无效,无视 PowerCLI 的配置
- vba - 如何在电子邮件正文中的特定单词后移动光标
- ionic-framework - 如何将图像插入
? (图像选择器) - sap - 无法启动 SAP BOBJ 服务器
- mongodb - MongoDB 查询聚合
- django - 如何在 Django 序列化程序的日期时间字段中允许空字符串
- google-bigquery - 分区 BigQuery 表,从 AVRO 加载
- mysql - Laravel 6 更新函数中的 SQLSTATE[42S22] 错误
- pyspark - 将 Apache Hudi 与 Python/Pyspark 一起使用
- c# - 从回调函数推断泛型参数类型