提问人:Ne Mo 提问时间:10/23/2023 最后编辑:mklement0Ne Mo 更新时间:11/15/2023 访问量:93
如何将这些对象分组为可以相互链接的对象?
How do I group these objects into those that can be linked to each other?
问:
我有一个已找到的项目和匹配项列表,如下所示。
项目 | 比赛 | |
---|---|---|
苹果 | 树;窗 | |
箱 | 显微镜 | |
烟囱 | 菜;栅栏 | |
菜 | ||
栅栏 | ||
耳机 | ||
显微镜 | 箱;耳机 | |
画 | ||
窗 | 烟囱;苹果 |
我想把它们分成几组,其中每个可以被另一个对象“到达”的对象都与该对象在同一组中。例如,苹果与栅栏属于同一组,因为在“匹配”列中,我们可以转到苹果->窗口->烟囱->栅栏。
然而,苹果与显微镜不在同一组,因为两者之间没有路径。它们不会在“匹配项”列中相互列出,并且这些项都不会在其“匹配项”列中列出其他项,依此类推。
项目 | 比赛 | 群 |
---|---|---|
苹果 | 树;窗 | 1 |
箱 | 显微镜 | 2 |
烟囱 | 菜;栅栏 | 1 |
菜 | 1 | |
栅栏 | 1 | |
耳机 | 2 | |
显微镜 | 箱;耳机 | 2 |
画 | 3 | |
窗 | 烟囱;苹果 | 1 |
^这是第三列 group 的样子。有没有办法使用 LAMBDA 函数(最好没有插件)来做到这一点?
像 TEXTJOIN 这样的东西是行不通的,因为尽管存在“路径”,但没有字符串匹配会连接“apple”和“chimney”,因为匹配不存在。
谢谢。
答:
1赞
Can.U
11/15/2023
#1
=MIN(
IFNA(
VLOOKUP("*"&
LET(
Z,LAMBDA(X,UNIQUE(TEXTSPLIT(TEXTJOIN(";",,REPT(A$2:B$10,BYROW(A$2:A$10&B$2:B$10,LAMBDA(S,COUNT(FIND(X,S))>0)))),,";"))),
Z(Z(Z(Z(A2)))))&"*",
IF({1,0},A$1:A$1&B$1:B1,C$1:C1),2,),9),N(C1)+1)
Z错层,我又加了两个,以防意外,仅供参考。
2赞
Clark
11/15/2023
#2
试一试:
=XMATCH("*"&A2&"*",REDUCE(,A$1:A10,LAMBDA(m,n,IF(COUNT(FIND(n,m)),m,VSTACK(m,REDUCE(n,A2:A10,LAMBDA(x,y,TEXTJOIN(";",,x,XLOOKUP(TEXTSPLIT(x,";"),A:A,B:B,"")))))))),2)-1
评论
0赞
Ne Mo
11/15/2023
这可以按要求工作,谢谢。你能解释一下它是如何工作的吗?我仍在努力了解 Lambda 函数,tbh。
评论