【问题标题】:how to add exactly 2nd and 3rd sublists with a list comprehension如何使用列表理解准确添加第二个和第三个子列表
【发布时间】:2014-12-07 17:32:27
【问题描述】:

我明天要参加期末考试。我正在尝试几个奇怪的例子。例如,给了我一个像这样的子列表列表:[[1, 2], [2, 3, 4], [5, 6], [7, 8], [8, 9, 10]]。我想将第二个和第三个子列表加在一起,并使用列表理解返回它们的总和。我尝试了很多事情,但我无法成功。

我意识到列表推导会为我的每个子列表生成一个 cons 对,并尝试添加每个 cons 对的第二个和第三个元素。但这不是我想要的。我想输出[20],因为2+3+4+5+6 = 20。

我写了这个,我试图只在一个缺点对中添加第二个子列表。但是没有办法也生成第三个子列表。所以我有点卡住了。:

sumTwoThree::[[Int]]->[Int]
sumTwoThree list = [(x + xs) | (x:xs)<-(list!!1)]

我也写了这个:

sumTwoThree::[[Int]]->[Int]
sumTwoThree list = [head xs + head (tail xs) | (x:xs)<-list, (length xs > 1)]

但这只会生成至少包含 3 个元素的子列表,然后将这些子列表的第二个和第三个元素相加。

【问题讨论】:

  • 您想在这里使用列表理解的任何特殊原因?
  • 因为我正在尝试练习列表理解。

标签: haskell list-comprehension


【解决方案1】:

基本上,您希望过滤掉任何不是第二个或第三个的子列表,然后将它们包含在结果中。之后,您使用sum。像这样:

sumTwoThree xs = sum [x | (i, sub) <- zip [1,2..] xs,
                          i == 2 || i == 3,
                          x <- sub]

如果不使用sum 函数,您将无法完成此操作。这是因为列表推导式只是使用列表单子的语法糖。而且你必须折叠一个列表来计算其元素的总和。

如果您想真正了解什么是列表推导式,请了解列表 monad,甚至尝试了解其工作原理:

foo []     = [[]]
foo (x:xs) = [x':xs' | x' <- x, xs' <- foo xs]

然后观察它的作用:

Main*> foo ["123", "abc"]
["1a","1b","1c","2a","2b","2c","3a","3b","3c"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2014-07-20
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多