使用 LAMBDA 在 Excel 中生成所有排列

2024-06-19

这是一个经常被问到和回答的问题:如何在 Excel 中生成所有排列:

2011 https://stackoverflow.com/questions/5724373/permutations-in-excel 2016 https://stackoverflow.com/questions/41053936/generate-all-permutation-of-multiple-lists-in-excel 2017 https://stackoverflow.com/questions/46101847/excel-permutation-table-without-vba 2017年超级用户 https://superuser.com/questions/1194312/excel-create-table-with-all-combinations/1194380#1194380 2018 https://stackoverflow.com/questions/48651400/how-to-list-all-possible-combinations-of-the-values-in-three-columns-in-excel 2021 https://stackoverflow.com/questions/67905393/how-to-generate-all-combinations-using-5-columns-using-a-formula-in-excel/67926177#67926177

现在在2022 https://stackoverflow.com/questions/71175705/excel-loop-from-list-with-formulas?noredirect=1#comment125834346_71175705在作为重复项关闭之前没有得到答案,这是不幸的,因为LAMBDA确实改变了回答这个问题的方式。

我很少有同样的需求,并且因不得不重新发明一个复杂的轮子而感到沮丧。因此,我将重新提出问题并在下面给出我自己的答案。我不会将任何提交标记为答案,但会邀请好的想法。我确信我自己的方法可以改进。

重申 2022 年问题

我正在尝试仅使用公式在 Excel 中创建循环。我想要实现的目标如下所述。假设我有 3 列作为输入: (i) 国家/地区; (ii) 变量; (iii) 年份。我想从这些输入进行扩展,然后为这些参数分配值。

Inputs:

Country Variable Year
GB GDP 2015
DE area 2016
CH area 2015

Outputs:

Country Variable Year
GB GDP 2015
GB GDP 2016
GB area 2015
GB area 2016
DE GDP 2015
DE GDP 2016
DE area 2015
DE area 2016

如何使用 Excel 有效地做到这一点?

扩展 2018 年问题

我有三列,每一列都有不同类型的主数据,如下所示:

现在,我想要这三个单元格的所有可能组合 - 就像

aa kk jj
aa kk ff
aa ll jj
aa ll ff
aa mm jj
...

这可以用公式来完成吗?我发现一个公式有 2 列,但我无法正确地将其扩展到 3 列

包含 2 列的公式:

=IF(ROW()-ROW($G$1)+1>COUNTA($A$2:$A$15)*COUNTA($B$2:$B$4),"",
INDEX($A$2:$A$15,INT((ROW()-ROW($G$1))/COUNTA($B$2:$B$4)+1))&
INDEX($B$2:$B$4,MOD(ROW()-ROW($G$1),COUNTA($B$2:$B$4))+1))

其中 G1 是放置结果值的单元格

共同要求

它们的共同点是它们都试图从一组有序的符号中创建一组有序的排列。它们都恰好需要 3 级符号,但 2018 年的问题是请求帮助从 2 级到 3 级,2021 年的问题是要求从 3 级到 5 级。2022 年的问题只是要求 3 级,但是输出需要是一个表。

如果我们像这样上升到 6 个级别会怎样?

L1 L2 L3 L4 L5 L6
A F K P U 1
B G L Q V 2
C H R W 3
D X 4
E

这将生成 1'440 种排列。

L1 L2 L3 L4 L5 L6
A F K P U 1
A F K P U 2
A F K P U 3
A F K P U 4
A F K P V 1
A F K P V 2
A F K P V 3
A F K P V 4
A F K P W 1
... ... ... ... ... ...

制定一个包含任意数量级别(列)的通用公式很困难。只需浏览所提供的答案即可 - 它们每个都需要一些火箭科学,到目前为止,所有解决方案都对符号列的数量进行了硬编码限制。所以LAMBDA能给我们一个通用的解决方案吗?


很酷的问题和脑筋急转弯;我只是对正在使用的东西感到困惑MAKEARRAY():


选项1:

您所说的“超级低效”是在计算行^列时创建排列列表。我认为下面的方法并没有那么低效。让我们想象一下以下情况:

公式为E1:

=LET(A,A1:C3,B,ROWS(A),C,COLUMNS(A),D,B^C,E,UNIQUE(MAKEARRAY(D,C,LAMBDA(rw,cl,INDEX(IF(A="","",A),MOD(CEILING(rw/(D/(B^cl)),1)-1,B)+1,cl)))),FILTER(E,MMULT(--(E<>""),SEQUENCE(C,,,0))=C))

简而言之,它的作用是:

  • 变量 A-D 都是辅助变量。
  • 然后的想法是只使用简单的INDEX()s 返回所有值。为此,我们需要行和列的正确索引。
  • MAKEARRAY()由于 lambda 带来的递归功能,将使计算相对容易。在这些函数内部,其基本数学运算返回这些行和列的正确索引。事实上,列不需要计算,因为我们只是引用“cl”,并且所有行索引的所有计算都是通过MOD(CEILING(rw/(D/(B^cl)),1)-1,B)+1.
  • 将上面的结果代入UNIQUE()使用很少的资源来过滤掉任何潜在的重复项and将潜在的空行限制为一个空行。
  • FILTER() and MMULT()很好地协同工作,过滤掉任何不需要的结果(读;空)。

这是我认为我能得到的那样紧凑和快速。该公式现在适用于任何连续的单元格范围。单个单元格、单行、单列或任何二维范围。


选项2:

OP 正确地提到,选项 1 可能会在开始时创建太多元组,然后才丢弃它们。这可能效率低下。为了解决这个问题(如果这不是您想要的),我们可以使用更大的公式。让我们想象一下以下数据:

A B C
a d f
b e h
e
c g
g

我们看到有空单元格和重复值。这些就是选项 1 创建过多元组的原因。为了反驳这一点,我想出了一个更长的公式:

=LET(A,A1:C5,B,ROWS(A),C,COLUMNS(A),D,IF(A="",NA(),A),E,MAKEARRAY(B,C,LAMBDA(rw,cl,INDEX(SORT(INDEX(D,0,cl)),rw))),F,BYCOL(E,LAMBDA(cl,COUNTA(FILTER(cl,NOT(ISERROR(cl)))))),G,MAKEARRAY(PRODUCT(F),C,LAMBDA(rw,cl,INDEX(E,MOD(CEILING(rw/IFERROR(PRODUCT(INDEX(F,SEQUENCE(C-cl,,cl+1))),1),1)-1,INDEX(F,cl))+1,cl))),UNIQUE(G))

分解一下:

  • LET()- 使用变量;
  • A- 我们最初的全范围细胞(连续);
  • B- A的总行数;
  • C- A的列总数;
  • D- 公式IF(A="",NA(),A)旨在检查矩阵中的每个值是否为空(字符串)。如果是这样,请将其设为错误(这将在下一步中有意义)。
  • E- 在这一步中,公式MAKEARRAY(B,C,LAMBDA(rw,cl,INDEX(SORT(INDEX(D,0,cl)),rw)))正在对每一列进行排序,因此值位于顶部,所有错误都被推到下面:
A B C
a d f
b e g
c e g
#N/A #N/A h
#N/A #N/A #N/A
  • F- 该变量的公式BYCOL(E,LAMBDA(cl,COUNTA(FILTER(cl,NOT(ISERROR(cl))))))现在将计算每列的项目数量。这是稍后使用和计算所有排列所必需的。在这个特定案例中的结果将是{3;3;4}.
  • G- 最后一个变量(如果选择这样使用它)使用MAKEARRAY(PRODUCT(F),C,LAMBDA(rw,cl,INDEX(E,MOD(CEILING(rw/IFERROR(PRODUCT(INDEX(F,SEQUENCE(C-cl,,cl+1))),1),1)-1,INDEX(F,cl))+1,cl)))。虽然很长,但每一步都很有意义;获取乘积(所有可能的排列)来计算行总数,列保持不变。在里面LAMBDA()我们引用当前列索引之后的所有列F多变的。这是一个相当大的块需要消化,不幸的是我解释得不够好=)。
  • UNIQUE(G)- 最后一步是过滤掉所有双重排列(如果有人选择的话)。

结果:

现在,尽管选项 1 在可读性方面胜过选项 2,但第二个选项(经过非常有限的测试)计算时间仅为第一个选项的三分之一。因此,就速度而言,第二种选择是首选。


作为第二个选项的替代方案,我首先有:

=LET(A,A1:C5,B,ROWS(A),C,COLUMNS(A),D,MAKEARRAY(B,C,LAMBDA(rw,cl,IF(MATCH(INDEX(A,rw,cl),INDEX(A,0,cl),0)=rw,INDEX(A,rw,cl),NA()))),E,MAKEARRAY(B,C,LAMBDA(rw,cl,INDEX(SORT(INDEX(D,0,cl)),rw))),F,BYCOL(E,LAMBDA(cl,COUNTA(UNIQUE(FILTER(cl,NOT(ISERROR(cl))))))),G,MAKEARRAY(PRODUCT(F),C,LAMBDA(rw,cl,INDEX(E,MOD(CEILING(rw/IFERROR(PRODUCT(INDEX(F,SEQUENCE(C-cl,,cl+1))),1),1)-1,INDEX(F,cl))+1,cl))),G)

现在这将改变D变量为更长的公式以预先删除每列中的重复项。两种变体都可以很好地工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 LAMBDA 在 Excel 中生成所有排列 的相关文章

  • 如何从shiny中将数据下载到多张纸上?

    我们如何将数据从 Shiny 下载到多个工作表并命名每个工作表 例如下面 ginberg将mtcars数据保存在sheet1中 我们可以将头部 mtcars 保存在sheet2中吗 另外 我们可以对这些工作表进行不同的命名吗 例如sheet
  • 如何在不使用外部库(如Numpy、Pandas)的情况下读取CSV文件?

    这是面试中经常出现的问题 我知道如何使用读取 csv 文件Pandas 然而 我正在努力寻找一种在不使用外部库的情况下读取文件的方法 Python 是否带有任何可以帮助读取 csv 文件的模块 你最有可能将需要用于读取 CSV 文件的库 虽
  • 如何解锁和锁定 Excel 单元格以运行宏

    我有一个电子表格 有两个按钮 从数据库检索记录 另一个按钮用于将更改从 Excel 上传到数据库 从数据库检索记录的宏如下 现在 在检索记录后 我希望用户仅编辑某些列 此处为从一月到场景的列 以便用户在更新这些单元格后可以单击更新按钮将更改
  • 使用java读取Excel工作表的单列

    我有一张 Excel 表格 我想编写一个方法 该方法将参数作为要读取的列号 并返回一个由该列中的所有数据组成的数组 然后将该列元素放置在 xml 工作表中 我怎样才能编写一个方法来做到这一点 使用 Apache POI 您可以在他们的使用页
  • Excel VBA 过滤器更改事件处理程序

    有没有办法知道用户何时对工作表过滤器进行了更改 换句话说 有没有一个change filter event某种处理程序 Yes 由此article http www experts exchange com Software Office
  • Excel 宏 - 复制并粘贴筛选的行

    因此基于工作表中的下拉选择 B 我们想要滚动浏览工作表中的一堆行 A 删除所有没有的Cell 4 dropDownValue 然后复制该范围并将其粘贴到工作表中 B 下面的代码运行但不执行任何操作 我可以调试并看到dropDownValue
  • 在 VBScript 中将 IF 语句拆分为多行

    我想知道在 VBScript 中我是否可以打破If多行语句 喜欢 If UCase Trim objSheet Cells i a Value YES Or UCase Trim objSheet Cells i b Value NO Th
  • 相应列值的最小值之和

    我有两列数字 我想在一个单独的单元格中计算总和 总和将包括这两列中相应单元格的最小值 Example A B 1 1 2 2 4 3 3 0 1 4 5 5 我需要一个公式来计算单元格中 1 3 0 5 的总和 其中 1 is the MI
  • 在 Excel 中,对每行的一列中的所有值求和,其中另一列是特定值

    我想知道是否有一种简单的方法可以完成我正在寻找的事情 基本上 我在 Excel 2011 中有一个包含大量数据的资产负债表 我一直希望看到的一项具体信息是尚未报销的金额 换句话说 我有一栏显示已支付的金额 另一栏显示是否已报销 是 否 我想
  • Excel 数据透视表

    我是一名 Excel 新手 想知道 Excel 是否具有内置功能来执行以下操作 转此数据 Name Activity Option Bob Monday Activities Golf Bob Tuesday Activities Kaya
  • 使用 SharedStringTable 和 .net 中的 xml sdk 设置文本值

    我有一段代码 如下 可以获取Excel中特定单元格的文本 但我不知道如何修改此文本以更改单元格文本 public static void UpdateTextCell string docName string text uint rowI
  • Excel 计数范围内唯一的 if

    如果 B 列是一个值 可以使用什么公式来计算 A 列中的唯一值 我在网上看到过很多 但当仅使用列范围时 它们似乎都不起作用 数据的长度将有所不同 因此只能使用列引用 这有效 SUMPRODUCT A1 A18 lt gt B1 B18 D
  • ASP.NET MVC FileResult 正在损坏文件

    我一直在尝试让我的 ASP NET MVC 网站将一些数据导出为 Excel 文件 几个小时以来 我一直以为 NPOI 只是在生产垃圾 所以我转向了 EPPlus 我在 LINQPad 中对其进行了测试 它创建了一个正常工作的 XLSX 文
  • 复制两个 Excel 实例之间的范围

    我正在运行两个单独的 Excel 实例 并且尝试将数据从一个工作簿中的范围复制到另一个工作簿中 我有这个代码 Sub CopyValues Dim xlApp As Excel Application Set xlApp GetObject
  • 如何从有条件的列中获取最新值

    我在 Excel 中有一个表 其中包含以下列 Date 人名 金额 英镑 该表用于记录人们何时付钱给我 通常 我可以让不止一个人在同一天向我付款 而且 随着时间的推移 同一个人会在很多天向我付款 记录添加到表格底部 以便按日期排序 但不再按
  • Excel 单元格对齐:例如数值xlLeft、xlRight 还是 xlCenter?

    我一直在尝试对齐 Excel 单元格文本值 我尝试过更常见的xlLeft xlRight但这似乎不起作用 错误是xlLeft没有宣布 我正在使用 Visual Studios 并使用 VB 创建一个 aspx 页面 这是我的代码示例 Dim
  • 在vba中为图例设置颜色代码

    我在每个工作表中都有数据透视表 我必须对它们进行比较 但每个工作表中图例的颜色都不同 如何设置颜色 例如 如果我的图例条目是 ISO 我希望它始终为 蓝色 如果它是 LAT 我希望它在每张纸中都为 红色 这可以通过操纵来完成Series中的
  • C# 如何判断单元格中的公式是否有错误

    在 Excel 公式中 您可以使用 ISERR A1 or ISERROR A1 在 VBA 宏中 您可以使用IsError sheet Cells 1 1 但是使用 VSTO Excel Addin 项目我没有在 Microsoft Of
  • 创建具有子级别的类属性

    我一直在读这个topic https excelmacromastery com vba class modules A Quick Guide to the VBA Class Module关于如何使用类模块 我的目标是提高代码性能和可读
  • 如何在没有任何数据行的情况下读取 Excel 表/ListObject 中的计算列的公式

    我有一个以外部查询作为数据源的 ListObject 它返回 18 列 ListObject 之前已添加了额外的 4 个计算列 现在 ListObject 有 0 个数据行 但是 虽然有 0 个数据行 但我似乎无法读取计算列的预定义公式 如

随机推荐

  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • 不允许对IsolatedStorageFile Stream 进行操作

    创建文件后打开该文件时出现错误 using var myFileStore IsolatedStorageFile GetUserStoreForApplication myFileStore CreateFile DateTime Now
  • InvalidOperationException:无法解析类型“Microsoft.AspNetCore.Http.IHttpContextAccessor”的服务

    我开始将我的 asp net core RC1 项目转换为 RC2 并面临现在的问题IHttpContextAccessor没有解决 为了简单起见 我使用 Visual Studio 模板创建了新的 ASP NET RC2 项目ASP NE
  • 无法填充名为“status”的数组

    我正在尝试做一些非常简单的事情 在 Javascript 中初始化一个数组 而且它在 Google Chrome 中不起作用 这是代码 status for i 0 i lt 8 i status i false alert status
  • 由于键更改而尝试插入时外键约束失败

    我有一个 Content 对象 它引用多对多关系中的一组 Tag 对象 作为持久化新内容对象的一部分 我在 PostgreSQL 中查看标签是否已存在 如果存在 则将对其的引用添加到内容对象并尝试保存内容对象 我遇到的问题是 当我这样做时
  • 按空值和非空值分组

    我有一个包含用户 facebook ID 的表 我必须报告谁在使用 facebook 或不使用 对于 facebook 用户 数据行包含一个数字 否则包含 null 我的结果必须是这样的 NbUsers Facebook 1000 no 5
  • benchmem 的输出

    使用内存分析器运行基准测试时 我看到以下输出 SomeFunc 100 17768876 ns op 111 B op 0 allocs op 我不明白输出 0 allocs op 但分配了 111 B 知道这意味着什么吗 我的函数是否在堆
  • Webpack 缺少 CommonsChunk 和 extract-text-webpack-plugin 模块

    我正在跟进Maxime Fabre 的 Webpack 教程 https blog madewithlove be post webpack your bags 我正在尝试获得一个非常简单的 webpack 包 其中包含 1 个入口点和 2
  • SSIS 包卡在“已创建执行”状态

    我最近对我的一个 SSIS 项目部署了更新 自从该项目失败后 它就按计划运行了 SSIS 包似乎停留在 已创建执行 状态 报告中没有任何消息来解释这个问题 我尝试重新部署该项目 但结果保持不变 我最终不得不恢复到早期版本的部署以使系统重新上
  • jQuery UI sortable 和 contenteditable=true 不能一起工作

    我正在创建一个列表并希望使其项目可排序和可编辑 所以我这样做 ul li span A span li li span B span li li span C span li ul ul list sortable http jsfiddl
  • 如何在 R 中为传单中的数值变量设置不对称颜色渐变

    我想让传单调色板以零为中心 红白绿发散 我已经尝试过中所说的这个帖子 https stackoverflow com questions 29262824 r center color palette on 0 当我尝试手动创建颜色时 我得
  • Microsoft Teams 中私人消息的传入 Webhook

    我可以从 C 应用程序或 PS 脚本创建传入 Webhook 将 JSON 消息发送到 MSFT 文档所解释的通道 但是 我想使用传入的 webhook 将 JSON 消息从我的应用程序发送到用户 作为私人消息 就像 Slack 允许的那样
  • 按日期合并多个日志文件,包括多行

    我有几个包含所有以时间戳开头的行的日志 因此以下内容可以按预期合并它们 cat myLog1 txt myLog2 txt sort n gt combined txt 问题是 myLog2 txt 还可以包含没有时间戳的行 例如 java
  • 为什么我们需要 scala 中的特征?

    所以 我试图制作一个 Finagle 服务器 与哨兵交谈 不重要 并偶然发现了一个案例 我需要从两个继承classes 不是特质 同时 我们称它们为class SentryHandler extends Handler and class
  • 如何设置视频分辨率?

    我正在使用 aForge 并尝试设置来自 USB 网络摄像头的视频源的分辨率 以便它正确适合图片框 我的目标分辨率是 800x600 但我得到的默认分辨率约为 640x480 当我尝试设置分辨率时 收到消息 无法修改只读字段的成员 有 aF
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • 如何在其他核心上运行每个线程?

    我有一个 udp 服务器接收数据并计算它 每个角色我都有两个线程 我的CPU是8个多核 我以不同的速度发送数据 但最多我只使用了 cpu 两核 50 的 14 如果我发送更多的数据值 我的缓冲区将填满并且不会使用更多的CPU 为什么每个核心
  • 如果基于 Spring 注解的控制器位于 jar 文件内,则该控制器无法工作

    我的子模块中有一些基于注释的控制器 这些模块作为 jar 文件部署 jar 文件中基于注释的控制器未加载到 spring 配置中 我使用 Eclipse 中的导出实用程序手动导出 jar 文件 有人遇到过这个问题吗 当您使用 Eclipse
  • 命名管道性能问题

    我使用命名管道进行 C 和 Delphi 之间的过程间通信 C 使用System IO Pipes包 而 Delphi 使用Libby s pipes pas 不幸的是 通信几乎是高性能的 分析显示通信占用了整个运行时间的 72 其余的用于
  • 使用 LAMBDA 在 Excel 中生成所有排列

    这是一个经常被问到和回答的问题 如何在 Excel 中生成所有排列 2011 https stackoverflow com questions 5724373 permutations in excel 2016 https stacko