我有一个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年的平均降雨量为0.78。
我制作了一个名为mylist的元组列表,格式为(年份,值,平均值,最小值,最大值),其中years为int,值为浮点列表,average为平均所有'值'的int,min是一个包含最小'value'和最大值
的int我的问题: 如何计算列表中第n个元素的平均值,例如1月,2月,3月的平均值...... 。
我有:
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
答案 0 :(得分: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)