有识之士,
我会让活动参与者注册,除了个人详细信息外,他们还提供双人合作伙伴的姓名或将其留空。因此,我将有两个专栏:参与者 (A2:A99) 和合作伙伴 (B2:B99)。每位参赛者的合伙人也将自行报名并提及其合伙人姓名。我希望创建另一个表,提供两列(D2:D99 和 E2:E99)以及二人组名称,其中 A 必须引用 B,反之亦然。在另一个表 (G2:G99) 中,我希望生成一份尚未让其合作伙伴注册或未提供合作伙伴姓名的人员列表。使用一些数据,假设以下示例和预期结果:
条目:
参与者 | 合作伙伴 |
---|---|
阿尔法 | 太棒了 |
狐步舞 | 回声 |
查理 | 德尔塔 |
太棒了 | 阿尔法 |
莱克斯 | |
回声 | 狐步舞 |
酒店 | 印度 |
德尔塔 | 查理 |
预期结果:
参与者 | 合作伙伴 |
---|---|
阿尔法 | 太棒了 |
狐步舞 | 回声 |
查理 | 德尔塔 |
无与伦比 |
---|
莱克斯 |
酒店 |
我想到了每个单元格的重复条目。在 D2:E2 中我将进行第一场双人比赛。然后在 D3 中,我会查找 A2:A99 中不在 $D$2:$E3 中的第一个唯一名称,找到其合作伙伴名称并检查他们是否也写了自己的名字。我想到的另一个开箱即用的想法(可能是愚蠢的想法)是分配一个唯一的质数,将 C2:C99 中的值相乘,并查找哪些值出现两次,质因数分解以找到每个唯一质数的每个对应名称。想到 Python,我立即想到了字典来查找唯一的对。但是,我不知道如何将其转换为有效的 Excel 公式。有人可以帮助我吗:)?
拜托,莱克斯。
首先,您可以通过检查参与者的伙伴是否确实是自己来验证参与者是否正确匹配。
例如对于参与者
Alpha
,在第1行,您可以看到它的伙伴是Bravo
,然后您进行查找,XLOOKUP(Bravo, lookup_array = participants, return_array = partners)
。如果 XLOOKUP
的结果确实是 Alpha
,则表示该对正确匹配。
公式为:
=LET(
participants, A2:A9,
partners, B2:B9,
reversed_partners, XLOOKUP(partners, participants, partners, ""),
matched, (reversed_partners = participants) * (partners <> ""),
matched
)
然后,您不想在结果表中同时包含
(Alpha, Bravo)
和 (Bravo, Alpha)
,因此,您需要一个运行计数来检查。
也就是说,当您将匹配对
(participant, partner)
添加到结果表中时,您需要检查该对的 participant
是否已包含在前一行的任何“合作伙伴”列中。
运行计数公式为
COUNTIF
:
=LET(
participants, A2:A9,
partners, B2:B9,
running_counts, MAP(
SEQUENCE(ROWS(partners)),
LAMBDA(row_num,
COUNTIF(INDEX(partners, 1):INDEX(partners, row_num), INDEX(participants, row_num))
)
),
running_counts
)
您可以将以上两项放在一个公式中:
=LET(
participants, A2:A9,
partners, B2:B9,
reversed_partners, XLOOKUP(partners, participants, partners, ""),
matched, (reversed_partners = participants) * (partners <> ""),
running_counts, MAP(
SEQUENCE(ROWS(partners)),
LAMBDA(row_num,
COUNTIF(INDEX(partners, 1):INDEX(partners, row_num), INDEX(participants, row_num))
)
),
HSTACK(matched, running_counts)
)
对于匹配的表,您需要正确匹配的对,并且 running_count = 0:
所以你的过滤公式可以这样写:
=FILTER(A2:B9,(C2:C9)*NOT(D2:D9))
对于不匹配的结果,您只需过滤掉“Matched = 0”的结果即可:
=FILTER(A2:B9,NOT(C2:C9))