F#过滤多年

时间:2015-02-26 12:42:33

标签: list function filter f#

我的目标是找到接下来几年的太阳总量 - 1960,1970,1980,1990,2000,2010。数据来自一个txt文件,已经定义了年,月,maxt,mint,afday,rain和sun,并从元组中获取相关元素,然后忽略其余元素。

// Example
let sun  (_,_,_,_,_,_,t) = t

我已经找到了1960年的太阳总量。但是,我不知道如何找到余下的年份。

let Q6 =
    ds |> List.filter (fun s-> year(s)=1960)
       |> List.sumBy sun

上面的方法是一个布尔值,所以多年不行,最好的方法是什么? 我相信答案应该是这样的:

val Q6 : float list = [1434.4; 1441.8; 1393.0; 1653.0; 1599.5; 1510.2]

1 个答案:

答案 0 :(得分:4)

您可以在应用总和之前对它们进行分组:

let Q6 =
    let years = [1960;1970;1980;1990;2000;2010]
    // or let years = [1960 .. 10 .. 2010]
    ds |> Seq.filter (fun value -> List.exists ((=) (year value)) years)
       |> Seq.groupBy year
       |> Seq.map (fun (year, values) -> year, Seq.sumBy sun values)
       |> Seq.toList

在这里你会得到类似的东西:

val Q6 : (int * float) list = [(1960, 1434.4); (1980, 1441.8)]

如果您不想在结果中包含年份,可以从lambda中删除year ,