PowerQuery中最重要的迭代函数
![](http://n4.ikafan.com/assetsj/blank.gif)
今天我们来聊一下PowerQuery中的迭代函数!PQ是函数式编程,没有很多语言中循环和迭代语法,但是却有对应的函数,有了他可以解决很多算法问题!
这个函数就是:List.Accumulate
官方案例:
![](http://n4.ikafan.com/assetsj/blank.gif)
我们先来解释一下官方这个累计的小案例,只有看懂了这个最基本的用法,才能进一步灵活引用!
解析说明:
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中如下写法:
![](http://n4.ikafan.com/assetsj/blank.gif)
C# 写法如下:
![](http://n4.ikafan.com/assetsj/blank.gif)
Python写法如下:
![](http://n4.ikafan.com/assetsj/blank.gif)
本文由“壹伴编辑器”提供技术支
有了上面基本的了解,我们来看看这个函数的语法及参数!
语法如下:
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}})
![](http://n4.ikafan.com/assetsj/blank.gif)
这个案例主要是进一步认识第二参数的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
结果:
![](http://n4.ikafan.com/assetsj/blank.gif)
本文由“壹伴编辑器”提供技术支持
PQ中的M函数还是很有意思的,有兴趣的同学可以研究一下,对于那些觉得编程麻烦,又有一些复杂的需求需要处理时,是一个不错的选择!