如果我有这样的列表:
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
。此解决方案是使用评论中的想法对我的原始解决方案进行的简化。
正如该评论中还指出的那样,还有一些调整是可能的 - 将两个
map
和 concat
省略为 concatMap
,并在 join
的 (->) r
实例中使用 Monad
来“简化” \l -> replicate l l
,为整个管道提供:concatMap (join replicate . length) . group $ lst
关于list - 如何找出给定元素所在组的大小?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21366758/