1

我在另一个列表中有一个元组列表,但在查找平均值时遇到了问题。

我已经检查了所提出的问题和互联网,但大多数时候它们不包括将所有元组加在一起和潜水。

我的列表元组列表是[(String, Int)],我希望能够找到所有元组的平均值。

4

4 回答 4

4

您可以使用 轻松将其转换为简单整数列表map snd。所以基本上,sum $ map snd listOfTuples把它们加在一起。(为了有效地计算平均值,您可能需要做一些更复杂的事情,但这应该会让您走上正确的轨道。)

于 2012-04-16T22:07:07.490 回答
1

此外,给定一个表单列表,[(String,Int)]您可以使用 unzip 函数,它具有类型

[(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)

于 2012-04-17T01:28:01.890 回答
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)]

请记住,fromIntegral如果您有所有 Ints 的列表,则可能必须使用

于 2012-04-17T01:01:16.700 回答
0

如果你在网上搜索,你会发现很多average :: (Real a, Fractional b) => [a] -> b功能,例如这里

所以你只需要一个 type 的函数[(String, Int)] -> [Int],然后你就可以把两者放在一起。

于 2012-04-16T22:06:04.147 回答