假设有以下代码检查一个数字的相乘数字是否等于输入数字:
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 除了它的长度之外,这有点无趣)。
