我在F#中有一系列国家/地区名称。我想知道序列中每个不同的国家/地区条目有多少。
Microsoft docs和MSDN中的countBy示例使用if
和else
来获取密钥,但由于我有~240个不同的条目,我想我不会&# 39; t需要为每个条目做出一个elif句子,对吧?
那么,是否可以选择使用另一个序列来获取countBy的键?
#load "packages/FsLab/FsLab.fsx"
open FSharp.Data
open System
type City = JsonProvider<"city.list.json",SampleIsList=true>
let cities = City.GetSamples()
let Countries = seq { for city in cities do yield city.Country.ToString() } |> Seq.sort
let DistinctCountries = Countries |> Seq.distinct
//Something like this
let Count = Seq.countBy DistinctCountries Countries
任何对我的city.list.json
感兴趣的人更新
我的输入序列是这样的(包含更多条目),每个代码重复,因为该国家/地区的许多城市都在原始列表中:
{ "AR","MX","RU","US"}
结果我期待:
{("AR", 50),("MX",40),...}
答案 0 :(得分:9)
Countries |> Seq.countBy id
id
是身份函数fun x -> x
。使用它,因为这里的“键”是序列项本身。
答案 1 :(得分:5)
您可以对国家/地区进行分组,然后计算每个组中的条目数:
let countsByCountry =
Countries
|> Seq.groupBy id
|> Seq.map (fun (c, cs) -> c, Seq.length cs)
此组合也实现为单个函数countBy
:
let countsByCountry = Countries |> Seq.countBy id
答案 2 :(得分:4)
那么,是否可以选择使用另一个序列来获取countBy的键?
您无需从某处获取密钥,传递给Seq.countBy
的函数会生成密钥。你应该能够逃脱这个:
let count =
cities
|> Seq.countBy (fun c -> c.Country.ToString())