首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Power Query:理解List.TransformMany双循环函数

本节视频可以观看bilibili的视频,搜索UP主【Excel和PowerBI聚焦】

在之前的章节中我们学习了列表遍历函数List.Transform函数,这个函数相当来说比较简单。不过,他还有一个大号兄弟——List.TransformMany函数。

如果你只看官方文档对这个函数的介绍很少也没有相应的一些案例说明,如果仅仅有这些,你基本上看不懂这个函数说了个啥。就该函数本身而言,其难度也是M函数中TOP5级别的,所以我们这一节的内容很有必要从我目前的实践来给大家介绍一个这个函数的用法。跟Excel VBA中的for next的双层循环非常相似。

功能:对给出的List列表按设定的条件进行遍历后并输出相应的结果。

语法:

其中:

第二个参数是一个funtion的类型;但是实际上作为双层循环的话,第二个参数一般的格式为:each {} 或者 (x)=> 的这种传递方式。

第三个参数也是一个function类型(一般是一个(x,y)=>的形式),这里的x传递的是函数的第一个参数,y传递的是该函数的第二个参数。

所以这个函数就具有很强的一个扩展性,并且难度也就上来了。我们先通过这两个简单的例子,来理解一个这个函数的运行的原理。

= List.TransformMany( ,each , (x,y)=>x  )

这个公式遍历(或循环)的时候,传递的是x的值,并没有传递y的值。

设x的每个值分别为x1,x2,…x4;y的每个值为y1和y2,结果为sx1,sx2,……,遍历开始:

所以结果为,这是因为外层遍历的时候,都会对应内层遍历的2个元素,最后生成了2位的外层元素,其类型对应的是外层元素的类型为list。第二个参数的each,我的理解是当循环外层的元素的元素,每个被循环的元素都对应着一个list,即,也就是最外层的每一个循环的元素,都是跟着内层的元素的个数循环一遍。输出结果时,我们可以自定义输出。比如这里的x。

= List.TransformMany(,each , (x,y)=>y )

来看这个公式的求值过程,因为输出的是y,所以结果记为sy:

所以生成的结果为

相较于上面的两个例子,这个例子,我们已经很熟练地可以看出这个公式是如何计值的。

经过上述两个简单的例子,我们基本上理解了该函数的一个循环的过程。

既然第二个参数是一个function,那么我们是不是可以直接写成一个函数呢?

比如这个公式,虽然没有报错,结果显示为error,错误提示是,无法将单个值转换为List.

分析一下,这是因为,第二个参数没有值,但是有转换的作用,当第一个参数的第一个元素遍历时,List.Sum对其求值,得出了一个值为45,同样,但是第一个元素是一个list,我们输出的值却是一个45的数值,所以提示报错了。我们尝试修改如下:

此时,返回,单击function可以看到是一个List.Sum函数。这就说明,这里输出的y就是一个List.Sum函数,我们只需要将遍历第一个参数的值传递给y就行了。

所以这个公式可以修改为:

这里的y(x)就相当于List.Sum(x)。所以上述公式的等价写法是:

但是即使是这样,这个例子我仍然不鼓励大家这样写,因为他有一个很简单的替代的公式。

这里这样写的本意是帮助大家理解List.TransformMany函数。

下面的这两个例子也是等价的,但是我不建议你这么写,因为List.Transform比它更简单。

接下来,我们看几个实战的例子:

这个例子用来生成ABC和abc的所有组合。

在List.Zip,List.Acumulate,List.InsertRange 这几节讲了工资条的生成的方法,在这里也可以使用List.TransformMany函数来完成。

在讲工资条的生成之前,我们先来看一下,如何在一个List列表中隔行加上空格。

这是一个非常简单的例子,将第一个参数按第二个参数循环两次后,输出y的值。

根据这个简单的例子,我们就可以来继续编写工资条的公式:

让我看看,是哪个小可爱翻到惊喜了~~

小必老师近期新出版的《Excel商务智能:Power Query和Power Pivot数据清洗、建模与分析实战》一书,在上市以来就取得不俗的表现,豆瓣上更是有了9.5分的评分。本书有50+的实战案例,有1G+的随书重难点章节的配套视频。主要讲解Power Query中的M和Power Pivot中的DAX,适用于Excel和Power BI。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230209A00RS800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券