确定可能组合的数量

2024-06-02 06:49:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道有多少种方法可以将不同的元素组合成这个字符串。在

"{Hello|Hi|Hey} {world|earth}{!|.|?}"

其中,从每个组({})中随机选择一个项目(用管道分隔)并组合成一个字符串。在

因此,上述“模板”可以产生:

^{pr2}$

我猜这是一种排列,但我想确定我是正确的。在

如果这也能与“n”嵌套项一起工作,那就太好了。在

"{{Hello|Hi|Hey} {world|earth}|{Goodbye|farewell} {noobs|n3wbz|n00blets}}"

如果可能的话,我更喜欢基于数学/统计的解决方案而不是暴力循环。在

谢谢!在


Tags: 项目方法字符串模板元素helloworld管道
2条回答

问题可分解为两个简单的子问题:

  1. 计算每个大括号对中有多少个组合在大括号内并在vbar中分开
  2. 把这些数字相乘

因此,对于1,我将使用普通正则表达式+循环方法:

import re

def docount(thestring):
    x = re.compile(r'{([^}]}')
    counts = [mo.group(0).count('|')+1 for mo in x.finditer(thestring)]
    result = 1
    for c in counts: result *= c
    return result

我也嵌入了2,因为这是最微不足道的部分(如果您热衷于使用reduce来达到这样的目的,我想这也可以代替最后三行;-)。在

在第一个例子中,有3×2×3=18个组合。在

第二个例子是3x4x2x3=72个组合。在

我不太清楚你所说的{a|b}|{c|d}不过,我假设你是指从(a或b)或(c或d)中选择一个,这是4个选择。在

您可能需要阅读组合here或{a2}。在


更新:是的,就是这么简单。你的问题就跟数数一个数的位数组合数一样。例如,如果我想找到一个ATM管脚号码(4个十进制数字)的组合数,我有集合{0-9},{0-9},{0-9},{0-9}。第一选择有10种可能性(=10)。对于每一个数字,第二个选择有10种可能性(=10×10)。对于每一个,第三个有10个(=10×10×10),第四个有10个(=10×10×10×10=10000)。直觉上应该很清楚,4位数的十进制数有10000种可能性。在

您的例子使用的是单词集而不是数字集,但原理是相同的。组合数是集合1中的项数×集合2中的项数×。。。×n组中的项数等

当你开始设置限制,或者从同一个集合中选择多个项目时,情况会变得更加复杂

相关问题 更多 >