【发布时间】:2018-09-26 00:57:11
【问题描述】:
我有一个包含元组的列表。我想将收到的列表的形式更改为不同的形式。下面的例子:
我正在接受
[[(String, Int, String, Int, String, Double)]] 或 [[(a,b,c,d,e,f)]]
我想把它变成如下形式的一个元组列表:
[(String,Double,Int)] 特别是[(e, ((d*f)/(d)), d)]
我正在尝试计算 GPA,其中列表包含一个元组列表,其中包含一个人正在学习的所有课程。 e 是人名,d 是学分数,f 是成绩点。每个元组中的名称都相同,但成绩和学分不同。
我不明白如何遍历列表列表中的所有元组并获取每个元组的d 和f,这是我计算 GPA 所需的值。
如果有任何帮助可以推动我朝着正确的方向前进,我将不胜感激。
谢谢
更新
我现在有一个元组列表。看起来像这样:
[("Erikson,Ann",2.0,3),("Erikson,Ann",3.33,3),("Lewis,Buck",2.66,1),
("Lewis,Buck",2.0,3),("Smith,John",0.0,1),("Smith,John",1.66,3),
("Smith,John",1.33,3),("Torvell,Sarah",4.0,3)]
我需要为每个人创建一个元组。元组应具有以下形式: (姓名、计算的 GPA、总学分)
计算出的 gpa 是每个元组的第二个元素乘以每个元组中的第三个元素加上该操作与所有其他同名元组的乘积。然后将该数字除以学分的总和(第三个元素)。元组中所有同名的第三个元素的总和就是第三个元素。混乱和努力工作。最后,我希望每个人都有一个元组。
我正在尝试这个:
type MyType2 = (String, Double, Int)
groupNameTuple :: MyType2 -> MyType2 -> Bool
groupNameTuple (a,_,_) (b,_,_) = a==b
calcGPA :: MyType2 -> MyType2 -> MyType2
calcGPA (a,b,c) (d,e,f) = (a, ((b*c)+(e*f))/(b+e), (b+e))
当我尝试在底部进行此计算时,它说中间元素不是双精度数。除了那个错误之外,这是在正确的方向吗?
谢谢
【问题讨论】:
-
也许join 函数会有所帮助。它可以获取列表列表并将其“展平”为单个列表。
-
我正在尝试你能展示你的尝试吗?
-
第一步是编写一个转换单个元组的函数,即
(String, Int, String, Int, String, Double) -> (String, Double, Int)类型的函数。你有没有尝试过这样做?告诉我们你已经走了多远! -
是的,我目前有:computeGpas = show 。 (map (map calcGPA) .groupBy groupName .sortBy byName) 。 (映射 stringToTuple) 。 (地图词)。行 calcGPA [[subject, num, section, credits, name,grade]] = (name,(grade*credits)/credits, credits) 这是我一直在尝试使用的。谢谢你。 @丹尼尔瓦格纳