tft每日頭條

 > 生活

 > 如何使用lambda函數

如何使用lambda函數

生活 更新时间:2025-02-08 09:11:02

HI,大家好,我是星光。今天給大家聊SCAN。

這貨的基本語法如下:

=SCAN(初始值,數據源, LAMBDA(參數1,參數2,計算方式))

它可以遍曆數據源的每一個數據,根據計算方式,返回一個與數據源尺寸相等的數組。

舉三個常見的用法小栗子。

1 填充空值

如下圖所示,A列存在合并單元格,現在需要創建一個内存數組,将A列的數據填充完整

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)1

——既然你已經學到SCAN,函數段位起碼也是星耀Ⅴ了,就别問我這個問題為什麼用内存數組,而不是基礎操作或者輔助列了。

SCAN函數解法參考如下:

公式看不全可以左右拖動..

=SCAN("",A1:A12, LAMBDA(_a,_b,IF(_b="",_a,_b)))

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)2

第1參數是初始值,第2參數是數據源A1:A12,第3參數是一個LAMBDA表達式,它又有3個參數,前兩個參數分别被命名為_a和_b,其中_a指向初始值,_b指向數據源的叠代元素,第3個參數是一條IF函數

IF(_b="",_a,_b)

IF函數的意思是如果計算元素_b為空,則返回初始值_a,否則返回_b自身。

SCAN遍曆數據源的每個元素,并執行LAMBDA計算,整個公式的計算過程如下▼

第1次先計算A1單元格的值,此時初始值_a為空,_b指向A1單元格,值為"姓名"。_b不等于空,IF表達式返回_b自身,SCAN将計算結果作為新的初始值。初始值_a也就變成了"姓名"。

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)3

第2次計算A2單元格的值,此時_b指向A2單元格,值為"看見星光",它不等于空,IF表達式返回_b自身,SCAN将計算結果作為新的初始值。初始值_a就變成了"看見星光"。

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)4

第3次計算A3單元格的值,此時_b指向A3單元格,值為空,它等于空,IF表達式返回初始值_a,SCAN将計算結果作為新的初始值。初始值_a依然是"看見星光"。

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)5

第4次計算A4單元格的值,此時_b指向A4單元格,值為空,IF表達式返回初始值_a,SCAN将計算結果作為新的初始值。初始值_a還是"看見星光"。

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)6

……

其餘以此類推,把每個元素遍曆完成後,将計算結果以數組的形式返回。

在各種親疏關系不同的場合裡我們都講過,工作表新函數正在加速向編程語言轉換,學習這類新函數,多少都需要一點編程的循環思維。如果你學過VBA又或者其它編程語言,再看這類新函數應該簡單很多,畢竟它們隻是一類被封裝好的基礎循環語句。

SCAN函數不但支持引用,也支持數組,不但支持查詢,也支持聚合等計算方式。

2 累加求和

如下圖所示,需要将A列的數據按B列的指定次數重複,D列為模拟結果。

(星光老師的原圖有公衆号二維碼,但是頭條号裡不允許,那就不好意思了……)

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)7

這題函數解法有十幾種,其中涉及到SCAN函數的解法參考如下:

=XLOOKUP(

SEQUENCE(SUM(B2:B5)), SCAN(0,B2:B5, LAMBDA(_a,_b,_a _b)), A2:A5, "",1,-1)

SCAN部分作為XLOOKUP函數的查詢範圍,對B列的數據累加求和。

SCAN(0,B2:B5, LAMBDA(_a,_b,_a _b))

第1參數是初始值,為0,第2參數是數據源B2:B5,第3參數是LAMBDA表達式。系統遍曆數據源的每一個數據▼

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)8

第1次時,初始值_a為0,計算元素_b指向B2單元格,為2,計算結果是_a _b,為2,作為新的初始值。

第2次時,初始值_a為2,計算元素_b指向B3單元格,為3,計算結果是_a _b,為5,作為新的初始值。

第3次時,初始值_a為5,計算元素_b指向B4單元格,為4,計算結果是_a _b,為9,作為新的初始值。

第4次時,初始值_a為9,計算元素_b指向B5單元格,為2,計算結果是_a _b,為11,作為新的初始值。

最後返回計算結果組成的内存數組:

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)9

XLOOKUP函數查找SEQUENCE函數生成的序列值,查找範圍是SCAN函數返回的累加求和的數組,結果範圍是A2:A5,查詢方式是從後往前找,找下一個較大項。比如,當尋找1時,匹配大于等于1的最小值2,返回對應的人名看見星光。

3 次數

如下圖所示,是A列各支隊伍10輪比賽的情況,需要在L列統計每支隊伍最大的連勝次數。

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)10

SCAN函數解法參考如下:

L2單元格輸入後向下複制填充:

=MAX(SCAN(0,B2:K2, LAMBDA(_a,_b,IF(_b="勝",_a 1,0))))

SCAN第1參數是初始值,為0,第2參數是數據源B2:K2,第3參數是LAMBDA表達式。遍曆數據源的每一個元素,如果為勝,則累加初始值,否則将初始值歸0。

SCAN函數返回一個内存數組。例如,二肥隊B3:K3返回結果如下:

如何使用lambda函數(LAMBDA函數賢内助SCAN函數會用了嗎)11

最後使用MAX函數從中取最大值,也就是相關隊伍的最大連勝次數。

相比于傳統的FREQUENCY函數而言,SCAN的計算過程是不是清晰很多?

最後給大家說一個好消息,在新函數體系裡,SCAN函數并不是必須的,大部分時候,它能做到的事情,REDUCE函數都能做到(效率和公式長短有差異)。然後再給大家說一個壞消息,号稱萬能函數的REDUCE相比SCAN函數而言,要更……難一些。

今天給大家分享的内容就這樣, 揮揮手,咱們明天再見。

原載公衆号:Excel星球

作者:看見星光

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved