如何构建动态增长的嵌套列表理解?

Alp*_*Alp 1 python list-comprehension

假设有以下代码检查数字的相乘数字是否等于输入数字:

results = [a for a in range(10) if a == input]
results += [a*b for a in range(10) for b in range(10) if a*b == input]
results += [a*b*c for a in range(10) for b in range(10) for c in range(10) if a*b*c == input]
...
Run Code Online (Sandbox Code Playgroud)

我想让它改变,以便在没有找到结果的情况下动态继续搜索匹配.所以:

  • 如果一位数字不能产生结果,请继续使用两位数字
  • 如果两位数字不产生结果,请继续使用三位数字
  • 等等 ...

我想以优雅的方式做到这一点,即使是单线,如果那不是太渐开始的话.如果根本没有匹配,我还需要一个中断条件来避免无限循环.例如,如果输入是素数> 10,则没有结果.休息条件应该是这样的:

if(math.pow(2, countOfDigits) > input):
    return
Run Code Online (Sandbox Code Playgroud)

where countOfDigits是嵌套列表推导中当前检查的位数.换句话说,我的初始示例的第一行表示countOfDigits == 1第二行countOfDigits == 2和第三行countOfDigits == 3.

Ste*_*sop 7

哦,继续吧:

next(
    sum(x) 
    for i in range(1, input) # overkill
    for x in itertools.product(range(10), repeat = i) 
    if reduce(operator.mul, x) == input
)
Run Code Online (Sandbox Code Playgroud)

编辑:你已经改变了问题以返回产品而不是总和,所以吐出input而不是sum(x).

我不是立即确定你是否想要第一场比赛,或者你想要所有比赛的因素数量等于最小的比赛.如果是后者,你可以通过吐出input, i这个迭代器来实现它,然后itertools.groupby根据元组中的第二个值来收集它们,然后只获取结果中的第一个值,并迭代它以获得所有匹配(虽然,因为你现在正在输出input那种不感兴趣的东西,而不是它的长度).