分享

PowerQuery中最重要的迭代函数

 Excel办公实战 2021-06-29

今天我们来聊一下PowerQuery中的迭代函数!PQ是函数式编程,没有很多语言中循环和迭代语法,但是却有对应的函数,有了他可以解决很多算法问题!

这个函数就是:List.Accumulate

官方案例:

我们先来解释一下官方这个累计的小案例,只有看懂了这个最基本的用法,才能进一步灵活引用!

解析说明

1、第一参数要求的是一个列表,第二参数这个是0,也就是初始值为0

2、第三参数是一个函数,(state,current)=> 计算逻辑,这里state表示每次计算后的结果,也就是下一次的初始值,current表示当前循环的元素!

下面是执行过程:

第1次循环:state = 0,current = 1, 第三参数计算 0 +1

第2次循环:state = 1,current = 2, 第三参数计算 1 +2

第3次循环:state = 3,current = 3, 第三参数计算 3 +3

第4次循环:state = 6,current = 4, 第三参数计算 6 +4

第5次循环:state = 10,current =5,第三参数计算 10 +5

全部遍历完,返回state的值!也就是15

如果你有其他语言的功底,可以辅助你理解

VBA中如下写法:

C# 写法如下:

Python写法如下

本文由“壹伴编辑器”提供技术支

有了上面基本的了解,我们来看看这个函数的语法及参数!

语法如下:
List.Accumulate(list as list, seed as any, accumulator as function) as any

这里最核心的就是第二参数是一个any类型,也就是可以是各种类型,包括复合数据类型!!

下面我们通过一些实际案例来巩固!

案例1 |  数据分组

案例说明:把一组数中小于10 和大于10的分成两组!

= List.Accumulate({1,20,3,2,43,23,5,10},{{},{}},(s,c)=> if c<10 then {s{0}&{c},s{1}} else {s{0},s{1}&{c}})

这个案例主要是进一步认识第二参数的any类型,这里我们使用的是一个list嵌套类型,{{},{}}  第一个用来装小于10,第二个用来转大于10的!

案例2 |  连续数字分成一组

案例说明:连续数值,放到一组!

1,2,3,10,22,23,34,66,67,68,69,100

// 公众号:Excel办公实战
// 作者:E精精
// ----------------------------------------------------------------
let
    // 第二参数说明:{结果,每组连续的列表,当前比较的值}
    ls = {1,2,3,10,22,23,34,66,67,68,69,100},
    res = List.Accumulate(
             ls & {null}, {{},{},""},(s,c)=>
                //第一次比较,转入其中,把当前值转入当前分组和比较直
                if s{2}="" then
                       {s{0},{c},c}
                // 满足连续分组,压入临时分组中
                else if c-s{2} = 1 then
                   {s{0},s{1}&{c},c}
                // 不连续,结束一组,压缩合并的结果中
                else
                   {s{0}&{s{1}},{c},c}

             ){0},
        // 合并一下最后的结果,处理一下最后结果,方便查看
    CombineData = List.Transform(res,each
                Text.Combine(List.Transform(_,Text.From),","))
    
in
    CombineData

结果:

本文由“壹伴编辑器”提供技术支持

PQ中的M函数还是很有意思的,有兴趣的同学可以研究一下,对于那些觉得编程麻烦,又有一些复杂的需求需要处理时,是一个不错的选择!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多