Skip to main content
 首页 » 编程设计

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

2025年05月04日12leader

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

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] 
... 

我希望它发生变化,以便在尚未找到结果时动态地继续搜索匹配项。所以:

  • 如果一位数没有产生结果,则继续使用两位数
  • 如果两位数没有产生结果,则继续使用三位数
  • 等等...

我想以一种优雅的方式来做到这一点,如果不太复杂的话,甚至是单行。如果根本没有匹配项,我还需要一个中断条件来避免无限循环。例如,如果输入是大于 10 的质数,则没有结果。中断条件应该是这样的:

if(math.pow(2, countOfDigits) > input): 
    return 

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

请您参考如下方法:

哦,那继续吧

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 
) 

编辑:您已将问题更改为返回乘积而不是总和,因此吐出 input 而不是 sum(x)。

我不确定您是想要第一个匹配项,还是想要因子数尽可能小的所有匹配项。如果是后者,你可以通过将 input, i 吐出这个迭代器来完成,然后使用 itertools.groupby 根据元组中的第二个值收集它们,然后只取其结果中的第一个值,并对其进行迭代以获得所有匹配项(尽管,由于您现在正在输出 input 除了它的长度之外,这有点无趣)。