functional-programming - 对元组列表中的数量求和
问题描述
例如,如果我有一个这样的列表:
[("pizza", 4); ("milkshake", 2); ("chocolate", 2); ("pizza", 3); ("milkshake", 3); ("pizza", 4)]
我想总结元组的所有第二个元素,而第一个元组是相同的。我该怎么做?
输出应该是:
[("pizza", 11); ("milkshake", 5); ("chocolate, 2")]
解决方案
您可以使用List.groupBy
根据项目名称对项目进行分组:
let items = [("pizza", 4); ("milkshake", 2); ("chocolate", 2); ("pizza", 3); ("milkshake", 3); ("pizza", 4)]
let grouped = List.groupBy fst items
// returns the following:
// [("pizza", [("pizza", 4); ("pizza", 3); ("pizza", 4)]);
// ("milkshake", [("milkshake", 2); ("milkshake", 3)]);
// ("chocolate", [("chocolate", 2)])]
这将返回一个元组列表,其中第一个条目是项目名称(例如比萨饼),第二个条目本身就是一个列表,包含与该名称匹配的所有原始元组。
然后您可以将每个子列表映射到第二个条目的总和:
let summed = List.map (fun (name, entries) -> (name, entries |> List.sumBy snd)) grouped
// returns [("pizza", 11); ("milkshake", 5); ("chocolate", 2)] as expected
List 模块的文档显示了用于处理列表的所有内置函数。
请注意,fst
和snd
是内置函数,它们分别返回双元素元组的第一个和第二个元素。
一旦您更熟悉 F#,您可能希望使用正向管道运算符|>
更简洁地执行此操作:
let summed =
items
|> List.groupBy fst
|> List.map (fun (name, entries) -> (name, entries |> List.sumBy snd))
推荐阅读
- .net-core - 查看 F# 项目 (fsproj) 的 dotnet 构建的编译器调用
- javascript - 当 if-else 满足条件时停止执行
- amazon-web-services - AWS redshift-data API:调用 DescribeStatement 操作时发生错误 (ResourceNotFoundException):查询不存在
- django - 如何显示用户网址头像
- python - 如何将信息从剧本传递到另一个剧本?
- node.js - 是否可以使用 MEVN 堆栈在某个日期前 x 小时向用户发送电子邮件提醒?
- android - how to post request message pack with okhttp3
- azure-active-directory - 使用R包AzureAuth获取的token查询数据
- ruby-on-rails - 如何在 Rails Admin 的显示和列表操作中使用关联集合的范围
- reactjs - React 测试库设置 window=undefined