【问题标题】:Calculate average in list of tuples F#计算元组列表中的平均值 F#
【发布时间】:2015-02-14 19:23:09
【问题描述】:

我有一个超过 3 年的雨量文本文件,其中年份后的每个数字对应于月份。 例如,在

2002    1.17    0.78    7.11    5.17    5.84    4.29    1.12    4.06    1.9 2.07    1.47    1.53
2001    1.24    3.22    1.61    3.33    6.55    2.4 3.5 1.32    3.9 6.04    1.69    1.13
2000    1.277   1.4 1.17    5.74    6.48    4.81    4.07    3.19    6.2 1.95    2.65    1.7

2002 年 2 月平均降雨量为 0.78。

我制作了一个名为 mylist 的元组列表,格式为 (year,values,average,min,max),其中 years 是 int,values 是一个浮点列表,average 是一个 int,它平均所有“values”,min是一个 int,包含最小的“值”和最大值。

我的问题: 如何计算列表中第 n 个元素的平均值,例如一月、二月、三月...的平均值。

我有:

 let months = [ "Jan"; "Feb"; "Mar"; "Apr"; "May"; "Jun"; "Jul"; "Aug"; "Sep"; "Oct"; "Nov"; "Dec" ] //string list

我正在考虑以下几点:

mylist |> List.map (fun (_,values, _, _, _) -> average 0th index across all tuples, print Jan, then average 1st index across all tuples, print Feb, etc...)

mylist |> List.map (fun (_,values, _, _, _) -> printfn"%A %A" List.average 0thIndex,0thMonth....List.average 1stIndex, 1stMonth, etc...)

但我对函数式语言不够熟悉,无法了解列表和地图上的所有操作。更喜欢 Java 和 C

【问题讨论】:

    标签: f# tuples


    【解决方案1】:

    我会将值映射到列表列表:

     let vs = mylist |> List.map (fun (_, values, _, _, _) -> values)
    

    然后将其转置以获取以月为单位的值列表。

     let mvs = vs |> transpose
    

    然后使用以下方法计算平均值:

     let avgs = mvs |> List.map List.average
    

    使用此answer 的转置。

    哦,如果您想以一种不错的方式打印它们:

     avgs |> List.iteri (fun i avg -> printfn "Month %s average: %d" months.[i] avg)
    

    【讨论】:

    • 哇,有很多语法和命令要学。谢谢,按预期工作!
    • 着眼于编写解决方案的方式,您应该改变思考问题的方式。尝试将数据视为值列表(其中值也可以是列表)并想象如何以您想要的方式转换它们,可能它将是一系列转换,每个转换都消耗前一个的输出。当你明白这一点时,剩下的就是找到一个可以进行这些转换的函数。
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2014-01-22
    • 2013-05-10
    相关资源
    最近更新 更多