我在另一个列表中有一个元组列表,我在找到平均值时遇到了问题。
我已经检查了问题和互联网,但大部分时间他们都不会将所有元组加在一起并潜水。
我的列表元组列表是[(String, Int)]
,我希望能够找到所有元组的平均值。
答案 0 :(得分:4)
您可以使用map snd
轻松将其转换为简单整数列表。基本上,sum $ map snd listOfTuples
将它们全部加在一起。 (为了有效地计算平均值,你可能想要做一些更复杂的事情,但这应该让你走上正确的轨道。)
答案 1 :(得分:1)
另外,给定[(String,Int)]
形式的列表,您可以使用解压缩函数,其类型为
[(a,b)] -> ([a],[b])
因此,要获得看起来像[(String,Int)]的列表的平均值,您只需使用:
(sum $ snd $ unzip myList) / length(myList)
您需要更正类型,以便可以使用fromIntegral函数进行分割。
因此,您可以编写以下函数:
average :: [(a,Int)] -> Double
average xs = (fromIntegral $ sum $ snd $ unzip xs) / (fromIntegral $ length xs)
答案 2 :(得分:0)
如果您在网上搜索,则会发现许多average :: (Real a, Fractional b) => [a] -> b
个功能,e.g. here。
所以你只需要一个[(String, Int)] -> [Int]
类型的函数,然后就可以把它们放在一起了。
答案 3 :(得分:0)
这是一种计算单次传递中总和和长度的方法。
它不漂亮,但它有效。
averageTuples ts = let results = calculateSum ts
in (fst results)/(snd results)
calculateSum ts = foldr acc (0,0) $ zip (map snd ts) (repeat 1) where
acc (x, y) (x', y') = (x+x', y+y')
main = print $ averageTuples [("foo", 1.09), ("bar", 2.6789), ("baz", 3.4)]
请注意,如果您有所有Ints的列表,则可能必须使用fromIntegral