【问题标题】:Simplify Python iterations简化 Python 迭代
【发布时间】:2026-01-17 22:05:01
【问题描述】:

每次我尝试解决一些数学问题,例如找到特定数量的因子的特定乘积时,我都会在 Python 中这样做

for x in xrange(1,10):
    for y in xrange(1,10):
        for z in xrange(1,10):
           product = x * y * z
           if product == 36:
               print "factors : {0},{1},{2}".format(x,y,z)

在这个例子中它非常简单并且可以快速完成工作,但我想知道你们是否知道更简单或更简单的方法来编写这个。关于如何在不使用那么多迭代或一遍又一遍地重复几乎相同的代码的情况下如何做到这一点的任何想法。这些显然是针对 3 个因素的,但我添加的因素越多,代码越长越重复。关于如何为这种简单类型的问题简化代码的任何想法? 谢谢

【问题讨论】:

  • 你的意思是product == 36(没有引号)?
  • if product == "36": 它看起来像一个错误。
  • 是的,对不起,我就是这个意思

标签: python product factorization


【解决方案1】:

Itertool 的cartesian product 模拟了多个嵌套for循环的效果。

import itertools

for x, y, z in itertools.product(range(1,10), range(1,10), range(1,10)):
    product = x * y * z
    if product == 36:
        print "factors : {0},{1},{2}".format(x,y,z)

结果:

factors : 1,4,9
factors : 1,6,6
factors : 1,9,4
(...etc)

如果 x、y 和 z 的范围始终相同,您可以只指定一次:

for x, y, z in itertools.product(range(1,10), repeat=3):

如果您厌倦了在 product = 行中输入无数个星号,您可以使用 reduce 将任意数量的参数相乘:

for factors in itertools.product(range(1,3), repeat=10):
    product = reduce(lambda x, y: x*y, factors)

一旦您的格式字符串变得笨拙,您可以依靠join 将因素串在一起:

if product == 512:
    #use `map` to turn the factors into strings, first
    print "factors: " + ",".join(map(str, factors))

【讨论】:

  • 在这种情况下,itertools.product 的唯一问题是难以优化。
【解决方案2】:

yx 开头来避免重复。计算z 而不是运行另一个循环。

for x in xrange(1,10):
    for y in xrange(x,10):
        z, r = divmod(36, x*y)
        if r == 0:
            print "factors : {0},{1},{2}".format(x,y,z)

对于更多因素,我会使用递归函数。

【讨论】: