从F#中的序列中获取不同值的计数

时间:2017-09-13 18:08:47

标签: f# f#-data

我在F#中有一系列国家/地区名称。我想知道序列中每个不同的国家/地区条目有多少。

Microsoft docsMSDN中的countBy示例使用ifelse来获取密钥,但由于我有~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),...}

3 个答案:

答案 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())