在日常数据分析中,我们经常会遇到需要生成数据序列的场景,这时很可能就需要用到PowerQuery中一个强大的M函数:List.Generate。本文将根据一些实用的应用场景,带你掌握List.Generate的基本用法。

List.Generate 用于动态生成列表。它通过用户定义的初始值、条件和迭代逻辑创建列表,支持从简单数字序列到复杂数据结构的生成。其主要特性包括:

  • 动态生成:根据函数逻辑生成任意类型的列表(数字、文本、记录等)。
  • 迭代支持:类似编程中的循环,适合处理依赖前值的计算。
  • 灵活转换:通过可选参数,可在生成时转换列表元素。

List.Generate语法

List.Generate(

   initial,

   condition, 

   next, 

   selector

)

initial:起始值,例如 () => 1

condition:判断条件,接受当前值并返回布尔值的函数,决定是否继续生成,例如 each _ < 10
next:生成下一个值的规则,例如 each _ + 1
selector(可选):输出结果,可省略,如果省略,按第3参数next输出。

List.Generate工作流程

1. 调用 initial 获取起始值。
2. 使用 condition 检查是否继续。
3. 若condition条件为真,通过next规则生成下一个值,生成后通过 selector(若提供)转换当前值并添加到列表。
4. 重复2、3步骤,直到条件为假。

List.Generate常用场景

下面通过7个常见的场景来看看这个函数的具体用法。
1. 递增序列

List.Generate(() => 1, each _ < 7, each _ + 1)

初始值1,后面每个值增加1,直到不满足条件<7时结束。

结果{1, 2, 3, 4, 5, 6}

2. 递减序列

List.Generate(() => 6, each _ > 0, each _ – 1)

结果{6, 5, 4, 3, 2, 1}

3. 奇数序列

List.Generate(() => 1, each _ < 12, each _ + 2)

结果{1, 3, 5, 7, 9,11}

4. 2的幂值

List.Generate(() => 1, each _ < 50, each _ * 2)

结果{1, 2, 4, 8, 16, 32}


5. 斐波那契数列

斐波那契数列中,每个数字是前两个数字之和。以下代码生成小于30的斐波那契数列:

7个实用场景,带你吃透PowerQuery超强函数List.Generate

List.Generate(

    () => [x = 0, y = 1], 

    each [x] + [y] < 30, 

    each [y = [x] + [y], x = [y]], 

    each [x] + [y]

)

解释:

  • 初始值:记录 [x = 0, y = 1]
  • 条件:x + y < 30
  • 下一步:更新 y = x + y为旧的 y
  • 返回: x + y

6. 生成阶乘序列

生成从1到7的阶乘数:

List.Generate(

    () => [x = 2, y = 1], 

    each [x] <= 8, 

    each [x = [x] + 1, y = Number.Factorial([x])], 

    each [y]

)

结果:{1, 2, 6, 24, 120, 720, 5040}  

7. 生成12个中文月份序列

List.Generate(

    () => #date(2025, 1, 1), 

    each Date.Year(_) < 2026, 

    each Date.AddMonths(_, 1), 

    each Date.MonthName(_,”zh-cn”)

)

结果{“一月”, “二月”, …, “12月”}


List.Generate PowerQuery 中一个功能强大且灵活的函数,也是一个非常实用的工具,掌握这个函数,能够帮助我们根据特定的逻辑生成各种列表,更高效地完成数据转换的多种场景,提升工作效率。