Google sheets GoogleSheets:当给定的元素在一行中时,如何获得包含1、2、3和4个元素的所有组合(没有重复)?

Google sheets GoogleSheets:当给定的元素在一行中时,如何获得包含1、2、3和4个元素的所有组合(没有重复)?,google-sheets,google-sheets-formula,combinations,Google Sheets,Google Sheets Formula,Combinations,我试图在Google Sheets中找到一种方法,以获得给定字符串集的唯一组合,但有以下限制: 给定的数据是一组字符串 每行一个输入集,最多17个“类型”(每列1个字符串) 所需输出:每行1、2、3和4种类型的所有组合 不需要在一个输入集中重复,即“a、b、c”也包括“a、c、b”、“b、a、c”等,但需要在不同的行中重复 输入字符串可能包含空格 (可选:)输出应按字母数字排序(整体或每组1、2、3和4个元素内) 具有给定数据和所需输出的示例表(手动创建): 给定数据示例: 所需输出示例

我试图在Google Sheets中找到一种方法,以获得给定字符串集的唯一组合,但有以下限制:

  • 给定的数据是一组字符串
  • 每行一个输入集,最多17个“类型”(每列1个字符串)
  • 所需输出:每行1、2、3和4种类型的所有组合
  • 不需要在一个输入集中重复,即“a、b、c”也包括“a、c、b”、“b、a、c”等,但需要在不同的行中重复
  • 输入字符串可能包含空格
  • (可选:)输出应按字母数字排序(整体或每组1、2、3和4个元素内)
具有给定数据和所需输出的示例表(手动创建):

给定数据示例:

所需输出示例(突出显示仅用于澄清):

我读过类似的问题和解决方案,比如:


但它们通常合并来自不同列的数据,而不是一行中的数据。解决方案差别很大,使用不同的函数(连接、连接、修剪、排序、报告等)。在阅读不同的问题时,这确实让人很难理解。

这里是一个仅针对5C4的概念证明:

=ARRAYFORMULA(mid(trim(query(transpose(if(mid(filter(base(sequence(2^5,1,0),2,5),
len(substitute(base(sequence(2^5,1,0),2,5),"0",""))=4),
{1,2,3,4,5},1)="1",","&B4:F4,)),"select *",9^9)),2,99))

以下是公式中向外工作的步骤:

这将是有趣的,看看这是否扩大到17C4

下面是相应的公式:

=ARRAYFORMULA(mid(trim(query(transpose(if(mid(filter(base(sequence(2^17,1,0),2,17),
len(substitute(base(sequence(2^17,1,0),2,17),"0",""))=4),
sequence(1,17),1)="1",","&A1:Q1,)),"select *",9^9)),2,99))

如果插入2380列,它似乎可以正常工作,所以只需要进行泛化,这样就有了一个变量而不是17。在每种情况下,必须对选择大小1、2和3重复此操作。

以下是仅针对5C4的概念证明:

=ARRAYFORMULA(mid(trim(query(transpose(if(mid(filter(base(sequence(2^5,1,0),2,5),
len(substitute(base(sequence(2^5,1,0),2,5),"0",""))=4),
{1,2,3,4,5},1)="1",","&B4:F4,)),"select *",9^9)),2,99))

以下是公式中向外工作的步骤:

这将是有趣的,看看这是否扩大到17C4

下面是相应的公式:

=ARRAYFORMULA(mid(trim(query(transpose(if(mid(filter(base(sequence(2^17,1,0),2,17),
len(substitute(base(sequence(2^17,1,0),2,17),"0",""))=4),
sequence(1,17),1)="1",","&A1:Q1,)),"select *",9^9)),2,99))

如果插入2380列,它似乎可以正常工作,所以只需要进行泛化,这样就有了一个变量而不是17。对于选择大小1、2和3,在每种情况下都必须重复此操作。

我不确定允许的最大列数:由于可能的组合数很多,表可能必须进行换位。我不认为您会用完列—例如,17C4仅为2380列,而这表示允许18278列。更简单的生成组合的方法使用二进制计数,但正如这里指出的,这对于增加n非常低效。例如,对于n=17,2^n=131072。这让我觉得您可能需要一个脚本。@TomSharpe:谢谢您对最大列数的澄清。幸运的是,我不需要2^n个组合,因为我只需要最多4个元素的组合。因此,组合的最大数量应为17C4+17C3+17C2+17C1=3213。也就是说,我可以编写一个脚本,但到目前为止,我只使用过公式。基于汤姆·夏普的回答,最终的公式是:=ARRAYFORMULA(替换)(转置)(排序)(转置)(mid(trim)(查询)(转置)(if)(mid)(过滤器(基(序列)(2^COUNTA(B3:3);1;0);2;COUNTA(B3:3));(len)(替换)(基(序列)(2^COUNTA(B3:3);1;0);2;COUNTA(B3:3));“0”)(3)2;2;3;2;3;3;3;3;3;计数a(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3);;;;;;;;;)))))))))))))))))))))))))))(3)(3)(3)(3)(3)(3)(3)(3)(。(。(。(。(。(3)(3)(3)(3)(3)(3)(3)(3)(3)(替换(基(基(替换(基(基(基(基(序列(序列(序列(3)(3(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3“,”))我已经用该解决方案更新了示例表。我不确定允许的最大列数:由于可能的组合数很多,表可能必须进行换位。我认为您不会用完列—例如,17C4仅为2380列,而这表示允许18278列。更简单的生成组合的方法使用二进制计数,但正如这里指出的,这对于增加n非常低效。例如,对于n=17,2^n=131072。这让我觉得您可能需要一个脚本。@TomSharpe:谢谢您对最大列数的澄清。幸运的是,我不需要2^n个组合,因为我只需要最多4个元素的组合。因此,组合的最大数量应为17C4+17C3+17C2+17C1=3213。也就是说,我可以编写一个脚本,但到目前为止,我只使用过公式。基于汤姆·夏普的回答,最终的公式是:=ARRAYFORMULA(替换)(转置)(排序)(转置)(mid(trim)(查询)(转置)(if)(mid)(过滤器(基(序列)(2^COUNTA(B3:3);1;0);2;COUNTA(B3:3));(len)(替换)(基(序列)(2^COUNTA(B3:3);1;0);2;COUNTA(B3:3));“0”)(3)2;2;3;2;3;3;3;3;3;计数a(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3);;;;;;;;;)))))))))))))))))))))))))))(3)(3)(3)(3)(3)(3)(3)(3)(。(。(。(。(。(3)(3)(3)(3)(3)(3)(3)(3)(3)(替换(基(基(替换(基(基(基(基(序列(序列(序列(3)(3(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3)(3“,”))我已经用解决方案更新了示例表。