如果我有这样的列表:

lst = [4,4,4,5,3,3,9]

我可以使用 group 来创建这个: [[4,4,4],[5],[3,3],[9]]

如果我有一个指向列表的索引,例如 i = 4 ,它指向第一个 3 元素,我怎样才能最好地编写一个函数来获取列表和索引,并返回索引指向的组的大小(在这个case,2,3s组的长度)?

我知道我可以非常命令式地编写它,并且我也可以将某些东西与 map length . group 组合在一起并计算在定位我的索引时我通过了多少组,但在我看来,必须有更好的方法来做到这一点。欢迎所有建议。

最佳答案

这是一个相当明确的阶段的解决方案,所以我可以解释每个步骤。

制作分组列表:

lst = [4,4,4,5,3,3,9]
lst1 = group lst

接下来,用长度替换组:
lst2 = map length lst1

这给了我们 lst2 = [3,1,2,1]
现在用该长度的列表替换长度,其中还包含每个位置的长度:
lst3 = map (\l -> replicate l l) lst2

现在我们有了 lst3 = [[3,3,3],[1],[2,2],[1]] ,这几乎是我们需要的,但我们不想要内部结构:
lst4 = concat lst3

现在我们有一些与原始列表长度相同的东西,但每个位置都有组长度而不是原始值。所以 lst4!!4 = 2

此解决方案是使用评论中的想法对我的原始解决方案进行的简化。

正如该评论中还指出的那样,还有一些调整是可能的 - 将两个 mapconcat 省略为 concatMap ,并在 join(->) r 实例中使用 Monad 来“简化” \l -> replicate l l ,为整个管道提供:
concatMap (join replicate . length) . group $ lst

关于list - 如何找出给定元素所在组的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21366758/

10-10 11:17